题目链接:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1437
思路:将不同的虫子放在不同的集合,并加上对虫子性别判断的操作。
参考文章:https://blog.csdn.net/wangjian8006/article/details/7846736
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 100100;
int tree[maxn],ans[maxn],n,fg; //tree确定集合,ans确定性别
void Init() //初始化
{
fg=1;
for(int i=1;i<=n;i++)
ans[i]=0,tree[i]=i;
}
int f(int x)
{
int rt;
if(x!=tree[x]) //找到x所在的集合
{
rt=f(tree[x]);
ans[x]=ans[x]^ans[tree[x]]; //如果插入集合的话需要改变一下性别
tree[x]=rt;
}
return tree[x];
}
void Merge(int x,int y)
{
int t1=f(x),t2=f(y);
if(t1!=t2) //两者不是同一集合
{
tree[t2]=t1; //将t2并入t1的集合
ans[t1]=~(ans[t1]^ans[t2]); //对新并入的t1修改,就是让两者不同
}
else fg=ans[x]^ans[y]; //两者是同一集合,判断性别是否相同,相同则返回0,有bug
}
int main(void)
{
int m,i,t,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
Init();
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
if(fg) Merge(x,y);
}
if(fg) printf("No suspicious bugs found!\n");
else printf("Suspicious bugs found!\n");
}
return 0;
}