背景
霍珀教授正在研究一种稀有的虫子的性行为。他假设它们具有两种不同的性别,并且它们只与异性的错误相互作用。在他的实验中,单个错误及其相互作用很容易识别,因为数字印在它们的背上。问题 鉴于错误相互作用列表,决定实验是否支持他假设两个性别没有同性恋错误,或者是否包含一些错误相互作用伪造它。
输入
输入的第一行包含方案数。每个方案都以一行开始,给出由单个空间分离的错误数(至少一个,最多 2000 个)和交互数(高达 1000000 个)。在以下行中,每个相互作用以两个不同的错误数字的形式由单个空间分离。错误从一个开始连续编号。
输出
每个场景的输出都是一行包含"场景#i:",其中我是从 1 开始的场景数,然后是一行说"没有发现可疑错误!
示例输入
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!
题意描述:多组测试,给小虫的数量,以及小虫的交互数,接下来每行是哪两只小虫交互,如果里面有小虫是同性就"Suspicious bugs found!“,全部都是异性就 "No suspicious bugs found!"
解题思路:可以用并查集,因为有很多组小虫,且小虫有两种,一种同性一种异性,所以对于给的小虫数n,我们假设每种小虫的数量都是n,所以初始化的时候是2*n,然后接下来的交互小虫们如果在一个集合就代表它们是同性,就标记一下,如果是异性就去集合。
AC:
#include<stdio.h>
int f[4010];
int getf(int v)
{
if(f[v]==v)
return v;
else
{
f[v]=getf(f[v]);
return f[v];
}
}
//合并两个子集
void merge(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
{
f[t2]=t1;
}
return ;
}
int main()
{
int n,k,x,y,t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
int flag=0; //注意
scanf("%d %d", &n,&k);
for(int j=1; j<=2*n; j++)
f[j] = j;
while(k--)
{
scanf("%d %d",&x,&y);//输入第几种情况信息
if(getf(x)==getf(y))//同性
flag=1;
else//异性去集合
{
merge(x,y+n);
merge(x+n,y);
}
}
printf("Scenario #%d:\n",i);
if(flag)
printf("Suspicious bugs found!");
else
printf("No suspicious bugs found!");
printf("\n\n");
}
return 0;
}