题意:A要找B谈恋爱,但是A不能直说。所以A找自己的好基友C,C又认识B的好闺蜜D,C就把消息传给了D,然后D就告诉自己的闺蜜B。
题目要求给出所有的A和B,找到这两个中间人,C和D;
unordered_map<string, unordered_set<string> > mp;
用来存两者的关系
注意输出的时候需要排序,参数1和参数2都是升序。
#include <cstdio>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <cmath>
using namespace std;
struct node{
string f, s;
};
bool cmp(node a, node b){
if(a.f != b.f) return a.f < b.f;
return a.s < b.s;
}
unordered_map<string, unordered_set<string> > mp;
bool check(string u, string v){
if(u[0]=='-' && v[0]=='-' || u[0]!='-' && v[0]!='-') return true; //同性别
return false;
}
int main(){
int n, m;
string u, v;
char str1[10], str2[10];
scanf("%d%d", &n, &m);
while(m--){
scanf("%s %s", str1, str2);
u = str1;
v = str2;
mp[u].insert(v);
mp[v].insert(u);
}
int k;
vector<string> C, D;
scanf("%d", &k);
while(k--){
scanf("%s %s", str1, str2);
u = str1;
v = str2;
vector<node> vt;
bool same = check(u, v);
C.clear();
D.clear();
//男闺蜜C
for(auto w: mp[u]){
if(w != u && w != v && check(u, w)) C.push_back(w);
}
//女闺蜜D
for(auto w: mp[v]){
if(w != u && w != v && check(v, w)) D.push_back(w);
}
//中间
for(auto c: C){
for(auto d: D){
if(!(same ^ check(c, d))) {
if(mp[c].count(d)) {
vt.push_back({c, d});
}
}
}
}
sort(vt.begin(), vt.end(), cmp);
cout<<vt.size()<<endl;
for(auto it: vt){
if(it.f[0]=='-') printf("%s ", it.f.substr(1).c_str());
else printf("%s ", it.f.c_str());
if(it.s[0]=='-') printf("%s\n", it.s.substr(1).c_str());
else printf("%s\n", it.s.c_str());
}
}
return 0;
}