题目的大意可以理解为:A爱B,B爱C ……给出一系列爱恋的关系,推断有没有同性恋。
思路是把相同性别的归为一个集合(等价类),异性的异性为同性。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=2010; 7 int f[N], r[N], flag; 8 void init() 9 { 10 for(int i=1;i<N;i++) 11 { 12 f[i]=i; 13 r[i]=0; 14 } 15 } 16 int Find(int x) 17 { 18 if(x==f[x]) return x; 19 return f[x]=Find(f[x]); 20 } 21 void Link(int x,int y) 22 { 23 int a=Find(x), b=Find(y); 24 if(a==b) flag=0; 25 else 26 { 27 if(r[x]) f[y]=Find(r[x]); 28 else r[x]=y; 29 if(r[y]) f[x]=Find(r[y]); 30 else r[y]=x; 31 } 32 } 33 int main() 34 { 35 //freopen("test.txt","r",stdin); 36 int x,y,n,m,cas,k; 37 scanf("%d",&cas); 38 for(k=1;k<=cas;k++) 39 { 40 scanf("%d%d",&n,&m); 41 init(); 42 flag=1; 43 while(m--) 44 { 45 scanf("%d%d",&x,&y); 46 if(!flag) continue; 47 Link(x,y); 48 } 49 printf("Scenario #%d: ",k); 50 if(flag) printf("No suspicious bugs found! "); 51 else printf("Suspicious bugs found! "); 52 printf(" "); 53 } 54 return 0; 55 }