题意大致为找同性恋的虫子。。。。
这个比食物链要简单些。思路完全一致,利用取余操作实现关系之间的递推。
个人感觉利用向量,模和投影可能可以实现具有更加复杂关系的并查集。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int MAXN=2010; 5 int fa[MAXN];int rel[MAXN]; //rel[i]=0 代表与根节点同性,1代表异性 6 void _set(int a) 7 { 8 for(int i=1;i<=a;i++) 9 { 10 fa[i]=i; 11 rel[i]=0; 12 } 13 } 14 int _find(int a) 15 { 16 if(a==fa[a]) return fa[a]; 17 int t=fa[a]; 18 fa[a]=_find(fa[a]); 19 rel[a]=(rel[a]+rel[t])%2; 20 return fa[a]; 21 } 22 void _union(int x, int y) 23 { 24 int fx=_find(x); 25 // int fy=_find(y); 26 // fa[x]=fy; 27 //rel[fx]=(1+rel[y]-rel[x]+2)%2; 28 fa[fx]=y; 29 rel[fx]=1-rel[x]; 30 } 31 int main() 32 { 33 // freopen("in.txt","r",stdin); 34 // freopen("out.txt","w",stdout); 35 int cases,flag,num,inter,x,y,fx,fy; 36 scanf("%d",&cases); 37 for(int i=1;i<=cases;i++) 38 { 39 scanf("%d %d",&num,&inter); 40 _set(num); 41 flag=0; 42 for(int j=1;j<=inter;j++) 43 { 44 45 scanf("%d %d",&x,&y); 46 fx=_find(x); 47 fy=_find(y); 48 if(fx==fy) 49 { 50 if(rel[x]==rel[y]) flag=1; 51 } 52 else _union(x,y); 53 54 } 55 printf("Scenario #%d: ",i); 56 if(flag) 57 printf("Suspicious bugs found! "); 58 else printf("No suspicious bugs found! "); 59 printf(" "); 60 } 61 62 return 0; 63 }