可以直接按照题目的要求做。
题目要求:AloveB,先找到A的同性好友C,再找到BC的共同好友D,且D的性别与B相同。虽然题目中说AB是同性or异性但其实处理起来是一样的。
如果想做的漂亮就需要一些小技巧and思考。
测试点2 应该是有-0000这样的数据,需要用字符串接收。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000;
unordered_map<int,int> gender;
unordered_map<int,bool> g;
vector<int> friends[maxn];
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int a,b;
// scanf("%d %d",&a,&b);
string c,d;
cin>>c>>d;
a=stoi(c);b=stoi(d);
g[abs(a)*10000+abs(b)]=g[abs(b)*10000+abs(a)]=true;
if(c[0]!='-') gender[abs(a)]=1;
else gender[abs(a)]=-1;
if(d[0]!='-') gender[abs(b)]=1;
else gender[abs(b)]=-1;
friends[abs(a)].push_back(abs(b));friends[abs(b)].push_back(abs(a));
}
int k;scanf("%d",&k);
for(int i=0;i<k;i++){
int cnt=0;int a,b;scanf("%d %d",&a,&b);
vector<pair<int,int>> v;
for(int j=0;j<friends[abs(a)].size();j++){//C
int c=friends[abs(a)][j];//abs值
if(gender[c]*gender[abs(a)]>0&&c!=abs(b)&&c!=abs(a)){//D
for(int k=0;k<friends[c].size();k++){
int d=friends[c][k];
if(g[abs(d)*10000+abs(b)]==true&&gender[d]*gender[abs(b)]>0&&d!=abs(a)&&d!=abs(b)){
v.push_back({c,d});
cnt++;
}
}
}
}
sort(v.begin(),v.end());
printf("%d\n",cnt);
for(int k=0;k<v.size();k++){
printf("%04d %04d\n",v[k].first,v[k].second);
}
}
return 0;
}
如果想要写的更短更好看,那么需要改的点:
1、vector<pair<int,int>> v;巨好用,不需要写结构体定义也不需要写cmp比较函数!
2、因为题目中的性别要求。找C时只需要在A的同性好友中找,找D时只需要在B的同行好友中找并判断一下CD也是好友。所以vector<int> friends[maxn];完全可以只存储同性别的好友!这样也不需要再去判断性别了。
3、为避免内存超限,使用unordered_map<int,bool> g;来代替二维数组
4、一开始字符串用string接收,只需判断两个字符串长度是否相等就能知道性别是否相同。
由这些可以将代码写成如下。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000;
unordered_map<int,bool> g;
vector<int> friends[maxn];
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int a,b;
string c,d;
cin>>c>>d;
a=stoi(c);b=stoi(d);
g[abs(a)*10000+abs(b)]=g[abs(b)*10000+abs(a)]=true;
if(c.length()==d.length()){
friends[abs(a)].push_back(abs(b));friends[abs(b)].push_back(abs(a));
}
}
int k;scanf("%d",&k);
for(int i=0;i<k;i++){
int a,b;scanf("%d %d",&a,&b);
a=abs(a);b=abs(b); //忘了就没结果
vector<pair<int,int>> v;
for(int j=0;j<friends[a].size();j++){
for(int k=0;k<friends[b].size();k++){
if(friends[a][j]==b||friends[b][k]==a) continue;
if(g[friends[a][j]*10000+friends[b][k]]==true)
v.push_back({friends[a][j],friends[b][k]});
}
}
sort(v.begin(),v.end());
printf("%d\n",v.size());
for(int k=0;k<v.size();k++){
printf("%04d %04d\n",v[k].first,v[k].second);
}
}
return 0;
}