A bug’s life
背景
Hopper教授正在研究一种稀有物种的性行为。他假设他们有两种不同的性别,他们只与异性发生性行为。每个个体的编号都印在他们的背上。
问题
给出一个bug之间的性行为列表,确定实验是否支持他的假设:该物种之间不存在同性恋关系。
输入
输入的第一行包含实验的数量。每个实验的第一行给出了bug数(至少一个,最多2000个)和性行为数(最多1000000)。在以下数行中,每行给出发生性行为的两只bug的编号。bug从1开始连续编号。
输出
每个场景的输出都是一行包含“Scenario #i:”,其中i是从1开始的实验编号。如果实验与他对bug的性行为的假设一致,则输出“No suspicious bugs found!” 。 如果Hopper教授的假设是绝对错误的,则输出“Suspicious bugs found!”。
样例输入
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
样例输出
Scenario #1:
Suspicious bugs found!
Scenario #2:
No suspicious bugs found!
#include <iostream>
using namespace std ;
// 1表示有关系0表示无关
const int MAX = 2000 ;
int parent [ MAX +10 ];
int relation [ MAX +10 ];
int t ;
int n , k ;
int Getroot(int a)
{
if(a==parent[a])
{
return a;
}
int t=parent[a];
parent[a]=Getroot(parent[a]);
relation[a]=(relation[a]+relation[t])%2;
return parent[a];
}
void merge(int a,int b)
{
int pa=Getroot(a);
int pb=Getroot(b); //压缩
parent[pa]=pb;
if(relation[a]+relation[b]!=1)
relation[pa]=1;
else
relation[pa]=0;
}
int main()
{
cin>>t;
for(int j=1;j<=t;j++)
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
{
parent[i]=i;
relation[i]=0;
}
int flag=0;
for (int i=1;i<=k;i++)
{
int a,b; //编号
scanf("%d%d",&a,&b);
int pa=Getroot(a);
int pb=Getroot(b); //压缩
if(pa!=pb)
{
merge(a,b);
}
else
{
if(relation[a]==relation[b])
{
flag=1;
continue;
}
}
}
if(flag==0)
cout<<"Scenario #"<<j<<":"<<endl<<"No suspicious bugs found!"<<endl<<endl;
else
cout<<"Scenario #"<<j<<":"<<endl<<"Suspicious bugs found!"<<endl<<endl;
}
return 0;
}