首页 > 代码库 > UnionFind2492
UnionFind2492
题目大意:输入一个数t,表示测试组数。然后每组第一行两个数字n,m,n表示有n只昆虫,编号从1—n,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