思路是记录每个人的同性朋友关系,再用一个二维数组Frd记录所有人的朋友关系
然后在处理每一对心动嘉宾时,将其同性朋友排序,然后二层循环判断并压入ans
注意点:
1、小心同性判断的条件,如果出现0000及-0000,正负判断将有很多问题,所以采用判断字符串长度的办法
2、特别小心心动嘉宾本来就是同性朋友的情况,如果不加以排除会多一些奇怪的输出(简直无力吐槽,想了很久,发现输在了好朋友的基情上,都是同性好友了,表个白还得走同性关系?)
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
vector<int> GFrd[10005];
int Frd[10005][10005]={0};
int N,M,K;
int main(){
cin>>N>>M;
for(int i=0;i<M;i++){
string A,B;
cin>>A>>B;
int a=abs(stoi(A));
int b=abs(stoi(B));
if(A.length()==B.length()){ //这里也坑,要小心-0000这种东西,正负判断不靠谱
GFrd[a].push_back(b);
GFrd[b].push_back(a);
}
Frd[a][b]=1;
Frd[b][a]=1;
}
cin>>K;
for(int i=0;i<K;i++){
int a,b,ct=0;
vector<int> ans;
scanf("%d %d",&a,&b);
a=abs(a);
b=abs(b);
sort(GFrd[a].begin(),GFrd[a].end());
sort(GFrd[b].begin(),GFrd[b].end());
for(auto it1:GFrd[a]){
for(auto it2:GFrd[b]){
if(it1==b||it2==a) continue; //这里好坑,要防止心动嘉宾们本来就是朋友
if(Frd[it1][it2]==1){
ans.push_back(it1);
ans.push_back(it2);
ct++;
}
}
}
printf("%d\n",ct);
for(int j=0;j<ct;j++){
printf("%04d %04d\n",ans[2*j],ans[2*j+1]);
}
}
return 0;
}