题意: 找 gay 。
给你n个人,再给你m次“交易”关系。
让你找出有没有人”交易“不正常;
题解:
并查集,两人共同祖先的话,比较关系,
否则合并。
要另外开一个数组。记录此点的性别(与祖先有关系,其实就是多少辈的关系)在find()中每次更新,
#include<iostream>
#include<string>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=2020;
int n,m,T,a,b;
int fa[maxn],rela[maxn];
int Find(int x){
if(fa[x]==x) return x;
int t=fa[x];
fa[x]=Find(fa[x]);
rela[x]=(rela[x]+rela[t])%2;
return fa[x];
}
int main()
{
scanf("%d",&T);
for(int ca=1;ca<=T;++ca){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i) fa[i]=i,rela[i]=0;
int flag=0;
while(m--){
scanf("%d %d",&a,&b);
if(flag) continue;
int x=Find(a),y=Find(b);
if(x==y){
if(rela[a]==rela[b]) flag=1;
}else {
fa[x]=y;
rela[x]=(rela[a]+rela[b]+1)%2;
}
}
printf("Scenario #%d:\n",ca);
if(flag)printf("Suspicious bugs found!\n");
else printf("No suspicious bugs found!\n");
if(m) printf("\n");
}
return 0;
}