hdu1272

本文详细解析了并查集的基本概念、操作原理及在实际问题中的应用,包括读入过程中合并集合的规则、避免孤立点的方法以及特殊情况的处理。通过实例分析,帮助读者深入理解并查集在连接问题上的高效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
分析:
    三点:
        1、读入过程中,合并集合的时候,如果,当前读入的两个
    元素属于同一个集合,那么肯定是No~;
        2、不要忘了最后要判断所有的点都要是连通的哦~不能有
    孤立的;
        3、读入只有0 0的时候,要输出Yes。。。


    数据水,房间编号可以是10W,以为要用链表来储存集合来着,
没想到就ac了 - -I ,估计出题的目的就只是初步掌握并查集吧。


                                                      2012-07-11
*/






#include"stdio.h"
#include"string.h"


struct A
{
	int hash;
	int pre;
}E[100011];


int max(int a,int b)
{
	return a>b?a:b;
}


int main()
{
	int a,b;
	int flag;
	int l;
	int limit;
	int temp;


	while(scanf("%d%d",&a,&b),a!=-1&&b!=-1)
	{
		if(a==0&&b==0)	{printf("Yes\n");continue;}


		memset(E,0,sizeof(E));
		E[a].hash=E[b].hash=1;
		E[a].pre=a;
		E[b].pre=a;
		limit=max(a,b);


		flag=0;
		while(scanf("%d%d",&a,&b),a||b)
		{
			if(flag)	continue;
			limit=max(limit,max(a,b));
			if(E[a].hash==0&&E[b].hash==0)
			{
				E[a].pre=a;
				E[b].pre=a;
				E[a].hash=E[b].hash=1;
			}
			else if(E[a].hash==0)
			{
				E[a].hash=1;
				E[a].pre=E[b].pre;
			}
			else if(E[b].hash==0)
			{
				E[b].hash=1;
				E[b].pre=E[a].pre;
			}
			else
			{
				if(E[a].pre==E[b].pre)	{flag=1;continue;}
				else
				{
					temp=E[b].pre;
					for(l=1;l<=limit;l++)	if(E[l].pre==temp)	E[l].pre=E[a].pre;
				}
			}
		}


		if(flag)	{printf("No\n");continue;}


		temp=E[limit].pre;
		for(l=1;l<=limit;l++)	if(E[l].hash&&E[l].pre!=temp)	{flag=1;break;}


		if(flag)	printf("No\n");
		else		printf("Yes\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值