题目描述
知识点: 枚举,图论
思路: 按照题目意思进行朋友的枚举然后判断即可。
另外,下面的代码实现是用邻接链表进行实现,但是其实只有300个点,可以使用hash将其映射然后使用邻接矩阵。
这里有一个坑点:也就是-0000是女生,这不好用数字判断是否为负数,所以统一需要转为字符串进行判断。
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5+10,M=200000;
int h[N],ne[M],e[N],is_women[N],idx,n,m;
struct Re{
int id1,id2;
bool operator < (const Re r) const{
if(id1 != r.id1) return id1 < r.id1;
return id2 < r.id2;
}
};
void add(int a,int b){
ne[idx] = h[a],e[idx] = b,h[a] = idx++;
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i = 0;i < m;i++){
string a,b;
int aa,bb;
cin>>a>>b;
if(a[0] == '-'){
aa = stoi(a.substr(1));
is_women[aa] = 1;
}else aa = stoi(a);
if(b[0] == '-'){
bb = stoi(b.substr(1));
is_women[bb] = 1;
}else bb = stoi(b);
add(aa,bb);
add(bb,aa);
}
int q;
cin>>q;
while(q--){
int a,b;
cin>>a>>b;
bool same_gender = false;
if(is_women[abs(a)] == is_women[abs(b)]) same_gender = true;
vector<Re> res;
for(int i = h[abs(a)];~i;i = ne[i]){
int u = e[i];
if(u == abs(a) || u == abs(b))
continue;
if(is_women[abs(a)] == is_women[u]){
for(int j = h[u];~j;j = ne[j]){
int uu = e[j];
if(uu == abs(a) || uu == abs(b))
continue;
if(same_gender && is_women[uu] == is_women[u]){
for(int q = h[uu];~q;q = ne[q]){
int uuu = e[q];
if(uuu == abs(b)){
res.push_back({u,uu});
}
}
}else if(!same_gender && is_women[uu] != is_women[u]){
for(int q = h[uu];~q;q = ne[q]){
int uuu = e[q];
if(uuu == abs(b)){
res.push_back({u,uu});
}
}
}
}
}
}
sort(res.begin(),res.end());
cout<<res.size()<<endl;
for(auto i : res){
printf("%04d %04d\n",i.id1,i.id2);
}
}
return 0;
}