题意:研究一种生物,有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 }