题目大意:有n个虫子,m个数据,每行数据有a,b两个虫子,意味着a,b可以交配。为有没有同性恋……
题目思路:并查集,每次加入的a,b如果father[a]和father[b]相同,就通过判断relation[a]和relation[b]是否相等来确定是否存在同性恋,不同则进行更新。
#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define INF 0x3f3f3f3f #define MAX 2200 using namespace std; int father[MAX],relation[MAX],ok;//relation[i]记录i与根节点的性别是否相同 int Find(int x) { int k; if(x==father[x]) return x; k=Find(father[x]); relation[x]=relation[x]^relation[father[x]]; return father[x]=k; } int main() { int i,j,n,m,T,a,b,cnt=1; scanf("%d",&T); while(T--) { ok=1; scanf("%d%d",&n,&m); memset(relation,0,sizeof(relation)); for(i=0; i<MAX; i++) father[i]=i; for(i=1; i<=m; i++) { scanf("%d%d",&a,&b); if(!ok) continue; int x=Find(a); int y=Find(b); if(x==y) { ok=relation[a]^relation[b];//若a,b与根节点的性别都相同或都不相同,则a,b为同性恋 } else { father[x]=y; int k=(relation[a]^relation[b]); if(k) relation[x]=0; else relation[x]=1; } } printf("Scenario #%d: ",cnt++); if(!ok) printf("Suspicious bugs found! "); else printf("No suspicious bugs found! "); } return 0; }