题目链接:请戳这里。
题目大意及思路:给定n个Bugs(shen me gui)和m对Bugs之间的关系,假定关系是两个Bugs的男女关系,那么问存不存在同性恋的情况。
那么若a与b是男女关系,b与c是男女关系,那么a和c的性别我们就可以认为是相同的。我们用可以建立两个并查集,一类放男男关系,一类放女女关系。
那么若男男关系中出现了环的情况(即有共同的根),那么同性恋关系就出现了。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 2000+10 using namespace std; int ok; int f[N],p[N]; //用p[]表示男女关系。 void Init(int n) { for(int i=1;i<=n;i++) { f[i]=i; p[i]=0; } } int Find(int x) { return x==f[x]?x:f[x]=Find(f[x]); } void Merge(int a,int b) //a和b有男女关系。 { int ra=Find(a),rb=Find(b); if(ra==rb) { //存在同性恋。 ok=0; return; } if(p[ra]) f[p[ra]]=rb; //p[ra]和rb是同种关系(男男) if(p[rb]) f[p[rb]]=ra; //p[rb]和ra是同种关系(女女) p[ra]=rb; p[rb]=ra; } int main() { int T,C=0; scanf("%d",&T); while(T--) { int n,m; scanf("%d %d",&n,&m); Init(n); ok=1; for(int i=0;i<m;i++) { int a,b; scanf("%d %d",&a,&b); Merge(a,b); } printf("Scenario #%d:\n",++C); if(ok) puts("No suspicious bugs found!"); else puts("Suspicious bugs found!"); puts(""); } return 0; }
原文:http://blog.csdn.net/darwin_/article/details/42809659