种类并查集,直接按照食物链的套路下来就好了.
#include<iostream>
#include<stdio.h>
using namespace std;
int father[2005],relation[2005];
int flag;
int find_ant(int x)
{
if(x!=father[x])
{
int temp=father[x];
father[x]=find_ant(father[x]);
relation[x]=(relation[x]+relation[temp])%2;
}
return father[x];
}
void unin(int x,int y)
{
int x_x,y_y;
x_x=find_ant(x);
y_y=find_ant(y);
if(x_x!=y_y)
{
father[y_y]=x_x;
relation[y_y]=(1+relation[x]+relation[y])%2;
}
else {
if(((relation[x]+relation[y])%2)!=1)
flag=0;
}
}
int main()
{
int t,n,m,a,b,i,count,p;
cin>>t;
count=0;
while(t--)
{
count=count+1;
cin>>n>>m;
for(i=1;i<=n;i++)
{
father[i]=i;
relation[i]=0;
}
flag=1;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
unin(a,b);
}
if(flag==1)
{
cout<<"Scenario #"<<count<<":"<<endl;
cout<<"No suspicious bugs found!"<<endl;
}
else {
cout<<"Scenario #"<<count<<":"<<endl;
cout<<"Suspicious bugs found!"<<endl;
}
cout<<endl;
}
return 0;
}