首页 > 代码库 > UnionFind2492

UnionFind2492

题目大意:输入一个数t,表示测试组数。然后每组第一行两个数字n,mn表示有n只昆虫,编号从1n,m表示下面要输入m行交配情况,每行两个整数,表示这两个编号的昆虫为异性,要交配。要求统计交配过程中是否出现冲突,即是否有两个同性的昆虫发生交配。

 

自己AC通过的,哈哈不容易~

 

#include<cstdio>

#include<cstring>

 

int r[2001],f[2001];

 

int find(int x)

{

int t;

if(x!=f[x])

{

t=f[x];

f[x]=find(t);

r[x]=(r[x]+r[t])%2;

}

 

return f[x];

}

 

void unit(int x,int y)

{

int fx=find(x);

int fy=find(y);

f[fx]=fy;

r[fx]=(r[y]+3-r[x])%2;

}

 

int main()

{

int j,i,N,K,x,y,casenum;

scanf("%d",&casenum);

for(j=1;j<=casenum;j++)

{

bool flag=0;

scanf("%d%d",&N,&K);

for(i=1;i<=N;i++)

{

r[i]=0;

f[i]=i;

}

for(i=1;i<=K;i++)

{

scanf("%d%d",&x,&y);

if(flag==1)

continue;///这里稍微注意下,不能因为已经得到结果就直接BREAK,毕竟输入的数据还是要进来,因此必须还要继续考虑到

 if(find(x)!=find(y))

unit(x,y);

else if(r[x]==r[y])

flag=1;

}

if(flag==0)

printf("Scenario #%d:\nNo suspicious bugs found!\n\n",j); 

else  

printf("Scenario #%d:\nSuspicious bugs found!\n\n",j);  

}

return 1;

}

UnionFind2492