hdu1272

/*
分析:
    三点:
        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;
}


你可能感兴趣的:(hdu1272)