本题跟是一个分类的并查集,我看了百度才出来的,关键是有一个数组来区分这个数据究竟属于哪一类
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=2000+100;
int val[maxn],par[maxn];
int flag,n;
int find(int x)//通过find来寻找父节点同时寻找性别关系
{
int k=par[x];
if(k!=x)
{
par[x]=find(k);
val[x]=(val[x]+val[k]+1)%2;//注意这里加一
//cout<<val[x]<<endl;
}
//cout<<par[x]<<endl;
return par[x];
}
int Union(int x,int y,int p1,int p2)
{
par[p1]=p2;
val[p1]=(val[y]-val[x])%2;
//cout<<val[p1]<<endl;
}
void init()
{
flag=0;
for(int i=0;i<=n;i++)
{
par[i]=i;
val[i]=1;//这里要初始化为1,1表示相同性别,0表示不同
}
}
int main()
{
int t,cnt=0,x,y,m;
//freopen("J.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
init();
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
int p1=find(x),p2=find(y);
if(flag) continue;
if(p1==p2)
{
//cout<<p1<<p2<<endl;
if(val[x]==val[y])
flag=1;
}
Union(x,y,p1,p2);
}
printf("Scenario #%d:\n",++cnt);
if(flag) printf("Suspicious bugs found!\n");
else printf("No suspicious bugs found!\n");
printf("\n");
}
return 0;
}