题意:给你一个n m,n代表有多少只昆虫,m代表2只给定的昆虫可以交配
要你来判断是否出现了同性的昆虫相交的情况
思路:并查集的一个小的应用。运用类别转移来做,详细请看代码,这个代码网上叫类别转移啊,发现新大陆了
#include<stdio.h> #include<string.h> int f[2005],link[2005]; int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } void make(int x,int y) { x=find(x); y=find(y); if(x==y) return ; f[y]=x; } int main() { int a,b,i,n,m,flag,t,cnt=1; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); for(i=1;i<=n;i++) { link[i]=0; f[i]=i; } flag=0; while(m--) { scanf("%d %d",&a,&b); if(flag) continue; int x,y; x=find(a); y=find(b); if(x==y) flag=1; if(link[x]==0&&link[y]==0) //如果2个数跟谁都还没有关系 { link[x]=y; //确定关系 link[y]=x; } else if(link[x]==0) { link[x]=y; make(x,link[y]); //将link[y]的父节点找出来,将x的值给f[y],只要再次出现x或是x的集合种的 } //那只虫,那么我们就找到了同类相交的情况 else if(link[y]==0) { link[y]=x; make(y,link[x]); } else { make(x,link[y]); make(y,link[x]); } } printf("Scenario #%d:\n",cnt++); if(flag) printf("Suspicious bugs found!\n\n"); else printf("No suspicious bugs found!\n\n"); } return 0; }
POJ 2492 A Bug's Life,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u012313382/article/details/38020421