标签:
考察并查集,
如果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