看了 两天并查集了 今天又做了一道题目 为做食物链做铺垫 不在这里爆发 就在这里死亡
呵呵.....现在感觉并查集也就是那么点事。 继续AC。
//并查集:利用关系进行判断例: a>b,b>c,则a>c;
//利用0表示同性,1表示异性。
#include<stdio.h>
#define max 1000010
int far[max];
int rank[max];
void inti(int ma)
{
for(int i=1; i<=ma; i++)
{
far[i]=i;
rank[i]=0;
}
}
int find_set(int n)
{
int tem;
if(n==far[n])
return n;
tem=far[n];
far[n]=find_set(tem);
rank[n]=(rank[n]+rank[tem])%2;
return far[n];
}
void Union_set(int x,int y,int a,int b)
{
far[x]=y;
rank[x]=(rank[b]+1-rank[a])%2;
}
int main()
{
int flag;
int T;
int a,b,m,n;
int aa,bb;
scanf("%d",&T);
int step;
for(step=1;step<=T;step++)
{
flag=0;
scanf("%d%d",&n,&m);
inti(n);
for(int i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
aa=find_set(a);
bb=find_set(b);
if(aa==bb)
{
if(rank[a]==rank[b])
flag=1;
}
else
Union_set(aa,bb,a,b);
}
if(flag)
printf("Scenario #%d:\nSuspicious bugs found!\n\n",step);
else
printf("Scenario #%d:\nNo suspicious bugs found!\n\n",step);
}
return 0;
}