A Bug's Life
#include<stdio.h>
#include<cstring>
using namespace std;
#define maxn 2222
int n,m,x,y,T;
struct node
{
int pos,same;
} xre,yre;
int fa[maxn*1000];
bool ans[maxn];
node fond(int x)
{
node ret;
if(fa[x]==0)
{
ret.pos=x;
ret.same=true;
return ret;
}
if(fa[x]>0)
{
ret=fond(fa[x]);
if(ret.same)fa[x]=ret.pos;
else
fa[x]=-ret.pos;
return ret;
}
ret=fond(-fa[x]);
if(ret.same)fa[x]=-ret.pos;
else fa[x]=ret.pos;
ret.same=!ret.same;
return ret;
}
int main()
{
scanf("%d",&T);
for(int t=1; t<=T; t++)
{
bool flag=true;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
fa[i]=0;
while(m--)
{
scanf("%d%d",&x,&y);
xre=fond(x);
yre=fond(y);
if(xre.pos==yre.pos)
{
if(xre.same==yre.same)
flag=false;
continue;
}
if(xre.same==yre.same)
fa[xre.pos]=-yre.pos;
else
fa[xre.pos]=yre.pos;
}
ans[t]=flag;
}
for(int t=1; t<=T; t++)
{
printf("Scenario #%d:\n",t);
if(ans[t])
printf("No suspicious bugs found!\n\n");
else
printf("Suspicious bugs found!\n\n");
}
return 0;
}