poj2492 带权并查集

题意:研究一种生物,有n个生物个体,发现有一些之间进行了交配,给出了这些关系,问是否有同性恋的bug出现。

用01表示某元素和其祖先元素的性别关系,0 为相同,1 为不同,用 mod2 实现累计处理,这样就能直接用并查集做了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int fa[2005],n,m,num[2005];
 5 
 6 void init(){
 7     for(int i=1;i<=n;i++)fa[i]=i;
 8     memset(num,0,sizeof(num));
 9 }
10 
11 int find(int x){
12     int r=x,t1,t2,c=0;
13     while(r!=fa[r]){
14         c+=num[r];
15         r=fa[r];
16     }
17     while(x!=r){
18         t1=fa[x];
19         t2=c-num[x];
20         fa[x]=r;
21         num[x]=c%2;
22         x=t1;
23         c=t2;
24     }
25     return r;
26 }
27 
28 int main(){
29     int t;
30     scanf("%d",&t);
31         for(int q=1;q<=t;q++){
32             scanf("%d%d",&n,&m);
33             init();
34             int i;
35             bool f=1;
36             for(i=1;i<=m;i++){
37                 int a,b;
38                 scanf("%d%d",&a,&b);
39                 int x=find(a),y=find(b);
40                 if(x!=y){
41                     num[x]=((num[b]+1-num[a])%2+2)%2;
42                     fa[x]=y;
43                 }
44                 else{
45                     if(num[a]==num[b])f=0;
46                 }
47             }
48             printf("Scenario #%d:
",q);
49             if(!f)printf("Suspicious bugs found!
");
50             else printf("No suspicious bugs found!
");
51             printf("
");
52         }
53     return 0;
54 }
View Code
原文地址:https://www.cnblogs.com/cenariusxz/p/4790247.html