大意:
科学家假定这种虫子只存在异性繁殖,然后给出了m组繁殖的虫子,判断它们之间的关系来求是否存在同性繁殖。
思路:
建立关系数组s来判断其与根节点的的关系,0为同性,1为异性。
判断出现同性繁殖的条件为出现一组虫子在一个集合中并且与根节点的性别关系相同,性别不同的情况为正确情况。
在不同集合中时进行合并操作。
TIP:判断出现同性繁殖也需要继续输入,Scenario之间有空行。
#include <iostream>
#include <vector>
#include <string.h>
#include <stdio.h>
using namespace std;
int n;
int f[60000],rank[60000],s[60000];
int find(int x,int &s1)
{
int t=x;
s1=0;
while(x!=f[x])
{
if(s[x]==1)
{
s1++;
if(s1>1)
s1=0;
}
x=f[x];
}
f[t]=x;
s[t]=s1;//路径压缩
return x;
}
bool judge(int x,int y)
{
int sx,sy;
int fx=find(x,sx);
int fy=find(y,sy);
if(fx==fy)
{
if(sy==sx)
return 0;
else
return 1;
}
else
{
f[fy]=fx;
if(sy==0&&sx==0)
s[fy]=1;
else if(sy==0&&sx==1)
s[fy]=0;
else if(sy==1&&sx==0)
s[fy]=0;
else if(sy==1&&sx==1)
s[fy]=1;
return 1;
}
return 1;
}
int main()
{
int m,t,x,y;
int T,c=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int ans=1;
for(int i=1; i<=n; i++)
f[i]=i,s[i]=0;
for(int i=0; i<m; i++)
{
scanf("%d%d",&x,&y);
if(!judge(x,y))
ans=0;
}
printf("Scenario #%d:\n",c++);
if(ans)
{
printf("No suspicious bugs found!\n");
}
else
{
printf("Suspicious bugs found!\n");
}
//if(T!=0)
printf("\n");
}
return 0;
}