思路参考:From柳神
一开始没考虑到(2、4)参考柳神的注意点后修改的代码。
1.用unordered_map<string, set > mp来表示邻接表(使用unordered_map比map时间复杂度小,不过使用map也可以AC)
2.A在寻找同性朋友时,需要避免找到他想要的伴侣B,所以当当前朋友就是B或者B的同性朋友就是A时舍弃该结果
3.输出时候要以4位数的方式输出,所以要%04d
4.如果用int接收一对朋友,-0000和0000对于int来说都是0,将无法得知这个人的性别,也就会影响他找他的同性朋友的那个步骤,所以考虑用字符串接收,因为题目中已经表示会以符号位加四位的方式给出输入,所以只要判断字符串是否大小相等,如果大小相等说明这两个人是同性(所以用string来存储邻接表中的元素)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<unordered_map>
using namespace std;
int n, m,k;
unordered_map<string, set<string> > mp;
struct friends{
int a, b;
friends(int _a, int _b):a(_a),b(_b){};
};
vector<friends> v;
bool cmp(friends a,friends b){
if (a.a != b.a) return a.a < b.a;
return a.b < b.b;
}
int main(){
scanf("%d%d", &n, &m);
string str1, str2;
int flag=1;
for (int i = 0; i < m; ++i){
cin >> str1 >> str2;
mp[str1].insert(str2);
mp[str2].insert(str1);
}
scanf("%d", &k);
for (int i = 0; i < k; ++i){
v.clear();
cin >> str1 >> str2;
if (mp.find(str1) != mp.end()&&mp.find(str2)!=mp.end()){
for (auto it=mp[str1].begin(); it!=mp[str1].end(); ++it){
if (str1.size()==(*it).size()&& (*it)!=str2){
for (auto it2=mp[str2].begin();it2!=mp[str2].end(); ++it2){
if (str2.size()==(*it2).size()&& *it2!=str1 && mp[(*it2)].find(*it) != mp[(*it2)].end()){
v.push_back(friends(abs(stoi(*it)), abs(stoi(*it2))));
}
}
}
}
}
sort(v.begin(), v.end(), cmp);
printf("%d\n", v.size());
for (int i = 0; i < v.size(); ++i){
printf("%04d %04d\n", v[i].a, v[i].b);
}
}
return 0;
}