【HDU - 1829】A Bug‘s Life(易懂并查集)

A Bug's Life

HDU - 1829

背景
霍珀教授正在研究一种稀有的虫子的性行为。他假设它们具有两种不同的性别,并且它们只与异性的错误相互作用。在他的实验中,单个错误及其相互作用很容易识别,因为数字印在它们的背上。问题 鉴于错误相互作用列表,决定实验是否支持他假设两个性别没有同性恋错误,或者是否包含一些错误相互作用伪造它。

输入

输入的第一行包含方案数。每个方案都以一行开始,给出由单个空间分离的错误数(至少一个,最多 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;
}

猜你喜欢

转载自blog.csdn.net/m0_58245389/article/details/120257061