Problem: 2492 User: zhouxc
Memory: 416K Time: 1266MS
Language: G++ Result: Accepted
Source Code
#include "iostream"
using namespace std;
int n,m,x,y,test;
int p[2001],rank[2001],opp[2001];
void Make_set()
{
for(int i=1;i<=n;i++)
{
p[i]=i;
opp[i]=-1;
rank[i]=0;
}
}
int Find_set(int a)
{
if(p[a]!=a)
p[a]=Find_set(p[a]);
return p[a];
}
void Union(int a,int b)
{
a=Find_set(a);
b=Find_set(b);
// printf("%d %d/n",a,b);
if(rank[a]>rank[b])
p[b]=a;
else if(rank[a]<rank[b])
p[a]=b;
else
{
p[b]=a;
rank[a]++;
}
}
int main()
{
int cunt=0;
scanf("%d",&test);
while(test--)
{
cunt++;
scanf("%d%d",&n,&m);
Make_set();
bool flag=true;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(Find_set(x)==Find_set(y))
flag=false;
else
{
if(opp[x]!=-1)
Union(y,opp[x]);
if(opp[y]!=-1)
Union(x,opp[y]);
opp[x]=y;
opp[y]=x;
}
}
printf("Scenario #%d:/n",cunt);
if(!flag)
printf("Suspicious bugs found!/n/n");
else
printf("No suspicious bugs found!/n/n");
}
return 0;
}