不完全ac代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<unordered_map>
#include<string>
#include<cstring>
using namespace std;
const int MAX_N = 10001;
unordered_map<int,vector<int> > relation;//关系网
unordered_map<int,int> hasPath;
int gender[MAX_N];//1表示女生,0表示男生
int n,m,k;
bool cmp(int a,int b){
return a<b;
}
vector<pair<int,int> > solve(int a,int b){
vector<pair<int,int> > ans;
vector<int> fa = relation[a];//表示a的伙伴集合
vector<int> fb = relation[b];//表示b的伙伴集合
sort(fa.begin(),fa.end(),cmp);
sort(fb.begin(),fb.end(),cmp);
for(int i = 0;i<fa.size();i++){
if (fa[i] == b || gender[fa[i]] != gender[a]) continue;
for(int j = 0;j<fb.size();j++){
if (fb[j] == a || gender[fb[j]] != gender[b]) continue;
if(hasPath[10000*fa[i]+fb[j]] == 1){//表示有路径可以联通
ans.push_back({fa[i],fb[j]});
}
}
}
return ans;
}
int main(){
//预处理
memset(gender,0,sizeof(gender));
cin>>n>>m;
for(int i = 0;i<m;i++){
int a,b;
cin>>a>>b;
if(a < 0){
gender[-a] = 1;
}
if(b < 0){
gender[-b] = 1;
}
relation[abs(a)].push_back(abs(b));
relation[abs(b)].push_back(abs(a));
hasPath[10000*abs(a)+abs(b)] = 1;
hasPath[10000*abs(b)+abs(a)] = 1;
}
cin>>k;
while (k--)
{
int A,B;
cin>>A>>B;
vector<pair<int,int> > res = solve(abs(A),abs(B));
cout<<res.size()<<endl;
for(int i = 0;i<res.size();i++){
printf("%04d %04d\n",res[i].first,res[i].second);
}
}
return 0;
}
后来看了柳神的博客,发现主要的原因在于有一个0000和-0000这个陷阱在里面。所以不能够用int作为a、b两个参数的类型,必须要用string。
(这样相当于把自己原来的代码推翻重写了,但我觉得自己考试的时候一定想不到,这个点太坑了。。)
最后附上参考柳神修改后的代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<unordered_map>
#include<string>
#include<cstring>
using namespace std;
const int MAX_N = 10001;
vector<int> v[MAX_N];
unordered_map<int,bool> arr;
int n,m,k;
struct node
{
int a,b;
};
bool cmp(node a,node b){
return a.a != b.a ? a.a < b.a : a.b < b.b;
}
int main(){
cin>>n>>m;
for(int i = 0;i<m;i++){
string a,b;
cin>>a>>b;
if(a.length() == b.length()){
//记录同性朋友直接的关系
v[abs(stoi(a))].push_back(abs(stoi(b)));
v[abs(stoi(b))].push_back(abs(stoi(a)));
}
arr[10000*abs(stoi(a))+abs(stoi(b))] = arr[10000*abs(stoi(b))+abs(stoi(a))] = 1;
}
cin>>k;
while (k--)
{
vector<node> ans;
int a,b;cin>>a>>b;
for(int i = 0;i<v[abs(a)].size();i++){
for(int j = 0;j<v[abs(b)].size();j++){
if(v[abs(a)][i] == abs(b) || v[abs(b)][j] == abs(a))continue;
if(arr[v[abs(a)][i]*10000+v[abs(b)][j]] == 1){
ans.push_back(node{v[abs(a)][i],v[abs(b)][j]});
}
}
}
sort(ans.begin(),ans.end(),cmp);
cout<<ans.size()<<endl;
for(int i = 0;i<ans.size();i++){
printf("%04d %04d\n",ans[i].a,ans[i].b);
}
}
system("pause");
return 0;
}