题意
A暗恋B,让朋友C传话给B的朋友D,D再传话给B。
- A.gender == C.gender
- B.gendre == D.gender
- C是A的朋友,不能是B本身
- D是B的朋友,不能是A本身
这样A暗恋B,需要两个朋友才能传话给B,找出所有对这样的朋友,从小到大输出。
思路
很明显遍历一下就能得出答案,注意到从小到大输出,map有排序功能,所以就用map,这样就省去了对结果进行排序的步骤。
有两点需要注意:
- 输入要用string 输入来判断性别,否则输入0无法判断性别。
- 并不要求A和B异性(我怎么变橘色了?)
Sample Input:
10 18
-2001 1001
-2002 -2001
1004 1001
-2004 -2001
-2003 1005
1005 -2001
1001 -2003
1002 1001
1002 -2004
-2004 1001
1003 -2002
-2003 1003
1004 -2002
-2001 -2003
1001 1003
1003 -2001
1002 -2001
-2002 -2003
5
1001 -2001
-2003 1001
1005 -2001
-2002 -2004
1111 -2003
Sample Output:
4
1002 2004
1003 2002
1003 2003
1004 2002
4
2001 1002
2001 1003
2002 1003
2002 1004
0
1
2003 2001
0
#include "bits/stdc++.h"
using namespace std;
int main(){
// freopen("input.txt","r",stdin);
int n, m; cin >> n >> m;
map<int,map<int,int>> links;
map<int,bool> gender;
for (int i = 0; i < m; ++i) {
string s1,s2; cin >> s1 >> s2;
int a = atoi(s1.c_str()), b = atoi(s2.c_str());
gender[abs(a)] = s1[0] != '-', gender[abs(b)] = s2[0] != '-'; // !
links[abs(a)][abs(b)] = 1, links[abs(b)][abs(a)] = 1;
}
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>> ans;
for(auto &item1:links[a]){
int fa = item1.first;
if (gender[a] != gender[fa] || fa == b) continue;
for(auto &item2:links[fa]){
int ffa = item2.first;
if ( ffa == a || gender[ffa]!=gender[b] || !links[ffa].count(b)) continue;
ans.emplace_back(fa,ffa);
}
}
cout << ans.size() << endl;
for(auto &item:ans) printf("%04d %04d\n",item.first,item.second);
}
}