标签:
考察并查集,
如果2个数的根节点相同,说明他们在同一集合众,检测他们是否是异性,若不是则有Bug
如果不相同,也判断一下他们是否异性,若不是,则将其中一个集合的性别翻转,再将其合并,否则直接合并
#include<iostream> #define maxn 2000+5 using namespace std; int n,m,flag; int f[maxn]; int sign[maxn]; void ready() { for(int i=1;i<maxn;i++) f[i]=i,sign[i]=0; flag=1; } int dfs(int x) { if(f[x]!=x) f[x]=dfs(f[x]); return f[x]; } void change(int x) { for(int i=1;i<=n;i++) { if(dfs(x)==dfs(i)) sign[i]=sign[i]^1; } } void build(int x,int y) { if(dfs(x)!=dfs(y)) { if(sign[x]==sign[y]) change(y); f[dfs(x)]=dfs(y); } else { if(sign[x]==sign[y]) flag=0; } } int main() { cin.sync_with_stdio(false); int t,casee=1,x,y; cin>>t; while(t--) { ready(); cin>>n>>m; while(m--) { cin>>x>>y; build(x,y); } cout<<"Scenario #"<<casee++<<":"<<endl; if(flag) cout<<"No suspicious bugs found!"; else cout<<"Suspicious bugs found!"; cout<<endl<<endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/45534237