题意:教授研究虫子,给出两两虫子的交配关系,问是否有×××出现。
并查集的应用,定义一个sex的数组,用于记录可以跟这个bug交配的另外一个的bug
用k来记录是否已经出现×××。
其实就相当于把输入有关系的两个分到两个集合中,检查给出的两个点是否出现
在同一个的集合中。
354ms代码,感觉用时太多了,但没有深究优化,代码如下
#include<iostream> int bin[2002],k,sex[2002]; int find(int x) { while(x!=bin[x]) x=bin[x]; return x; } int merge(int x,int y) { int fx,fy; fx=find(x); if(sex[y]==0) sex[y]=x; fy=find(y); if(fy==fx) k=1; else { fy=find(sex[y]); if(fy!=fx) { bin[fx]=fy; } } return 0; } int main() { int t,n,m,i,x,y,j; scanf("%d",&t); j=0; while(t--) { j++; scanf("%d %d",&n,&m); k=0; for(i=1;i<=n;i++) { bin[i]=i; sex[i]=0; } for(i=0;i<m;i++) { scanf("%d %d",&x,&y); if(k==0) merge(x,y); if(k==0) merge(y,x); } printf("Scenario #%d:\n",j); if(k==1) printf("Suspicious bugs found!\n"); else printf("No suspicious bugs found!\n"); printf("\n"); } return 0; }