这题跟 POJ 1703 Find them and Catch them 是一样一样的,就不讲解了,不懂可以看
http://www.cnblogs.com/whatbeg/p/3498416.html
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstdio> using namespace std; #define N 2100 int fa[N],sa[N]; void makeset(int n) { for(int i=1;i<=n;i++) { fa[i] = i; sa[i] = 0; // 0 : same 1 : different } } int findset(int x) { if(x != fa[x]) { int tmp = fa[x]; fa[x] = findset(fa[x]); sa[x] = (sa[tmp] + sa[x]) % 2; } return fa[x]; } void unionset(int a,int b) { int x = findset(a); int y = findset(b); if(x == y) return; fa[x] = y; sa[x] = (sa[a] + sa[b] + 1)%2; return; } int main() { int t,n,m,i; int a,b; int cs = 1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); makeset(n); int flag = 1; for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); if(findset(a) == findset(b)) { if(sa[a] == sa[b]) { flag = 0; } } else unionset(a,b); } printf("Scenario #%d:\n",cs++); if(flag) cout<<"No suspicious bugs found!"<<endl; else cout<<"Suspicious bugs found!"<<endl; cout<<endl; } return 0; }