题目大意:A喜欢B,但是A不会直接找B,A要找他的朋友且同性别的C,然后C去找和B的朋友且同性别的D,让D去联系B,给定 A和B,求C和D有哪些
这题目坑有点多
1.输入有可能有0000和-0000出现,所以不能用相乘是否大于0判断是否同性别
2.遍历A的朋友的时候,C可能是B,同理D可能是A,这俩中情况要排除
3.暴力写最后一个测试点会超时,需要用hash表来判断俩人是否是朋友(经典空间换时间)
4.输出的时候要 "%04d"
hash表的计算公式有很多,我的只是其中一种,只要不会重复都可以,我们这个公式为什么不会重复,是因为每个人的id是不同的,然后把id看成数字,则id*10000 = id0000,因为id不同,则(A的id0000)和(B的id0000)肯定不同,所以就不会出现A和B是朋友,A和C是朋友但key值相同。
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 1e4 + 10 ;
const ll inf = 0x3f3f3f3f ;
const ll mod = 12345678901 ;
unordered_map<int , int > mp ;
vector<int > g[10000] ;
void deal(){
int n , m ; cin >> n >> m ;
for(int i = 0 ; i < m ; i++){
string u , v ; cin >> u >> v ;
//只存同性别的人
if(u.size() == v.size()){//stoi(u) * stoi(v) < 0不能这么写,有可能有+0或-0
g[abs(stoi(u))].push_back(abs(stoi(v))) ;
g[abs(stoi(v))].push_back(abs(stoi(u))) ;
}
//hash表来判定俩个人有没有关系
mp[abs(stoi(u)) * 10000 + abs(stoi(v))] = mp[abs(stoi(v)) * 10000 + abs(stoi(u))] = 1 ;
}
int k ; cin >> k ;
for(int i = 0 ; i < k ; i++){
int u , v ; cin >> u >> v ;
u = abs(u) ;
v = abs(v) ;
vector<pair<int , int > > ans ;
for(int j = 0 ; j < g[u].size() ; j++){//A朋友 = C
for(int l = 0 ; l < g[v].size() ; l++){//B朋友 = D
//需要排除C是v或D是u 的情况
if(g[u][j] == v || g[v][l] == u) continue ;
if(mp[g[u][j] * 10000 + g[v][l]]) {//只用写一个,避免重复
ans.push_back({g[u][j] , g[v][l]}) ;
}
}
}
sort(ans.begin() , ans.end()) ;
cout << ans.size() << endl ;
for(int j = 0 ; j < ans.size() ; j++){
printf("%04d %04d\n" , ans[j].first , ans[j].second) ;
}
}
}
int main(){
deal() ;
return 0 ;
}