标签:des style blog java color strong
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8224 Accepted Submission(s): 2631
这道题很像算法艺术与分析上的并查集那一部分的第二题。。额。。好像是这道题。。
假设a 和b 是异性,b和c是异性, 那么a和c就是同性,所以所有的虫子分成两部分即a的同性,和a的异性。
那么可以用数组存储和a同性的,数组为Q[],那么就有Q[a]=b。若又出现a和d是异性,那么就把Q[a]和d并在一棵树里即unsion(Q[a],d),因为是相互的,所以也有unsion(Q[d],a);
最终就成了两个集合,若输入a b在同一集合中就意味着a和b是同性恋。。。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <queue> 5 #include <iostream> 6 using namespace std; 7 8 int father[1000005]; 9 int Q[1000005]; 10 11 int findroot(int p) 12 { 13 int r=p; 14 while(r!=father[r]) 15 r=father[r]; 16 return r; 17 } 18 19 void unsion(int p,int q) 20 { 21 int fp=findroot(p); 22 int fq=findroot(q); 23 father[fq]=fp; 24 } 25 main() 26 { 27 int n, m, i, j, k=1; 28 int t; 29 cin>>t; 30 while(t--) 31 { 32 scanf("%d %d",&n,&m); 33 int flag=0, x, y; 34 for(i=1;i<=n;i++) father[i]=i; 35 memset(Q,0,sizeof(Q)); 36 while(m--) 37 { 38 scanf("%d %d",&x,&y); 39 if(flag) continue; 40 int fx=findroot(x); 41 int fy=findroot(y); 42 if(fx==fy) 43 { 44 flag=1; 45 continue; 46 } 47 if(!Q[x]) Q[x]=y; 48 else unsion(Q[x],y); 49 if(!Q[y]) Q[y]=x; 50 else unsion(Q[y],x); 51 } 52 printf("Scenario #%d:\n",k++); 53 if(flag) cout<<"Suspicious bugs found!"<<endl<<endl; 54 else cout<<"No suspicious bugs found!"<<endl<<endl; 55 } 56 }
标签:des style blog java color strong
原文地址:http://www.cnblogs.com/qq1012662902/p/3847458.html