HDU 1272并查集 开始错的很郁闷

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1272


AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 100001
using namespace std;

int set[maxn],num[maxn];
int find(int x)
{
	if(set[x] == x)return x;
	return set[x] = find(set[x]);
}
int main()
{
	int n,m,pos;
	while(scanf("%d%d",&n,&m))
	{
		if(m==-1 && n==-1)break;
		if(m==0 && n==0){puts("Yes");continue;}
		memset(num,0,sizeof(num));
		num[n] = num[m] = 1; 
		for(int i =1; i <= maxn; i++)
			set[i] = i;
		pos = 0;
		if(find(n)==find(m))pos = 1;
		else 
			set[find(n)] = find(m);
		while(scanf("%d%d",&n,&m),(n&&m))
		{
			num[n] = num[m] = 1; 
			if(find(n)==find(m))pos = 1;
			else
				set[find(n)] = find(m);
		}
		if(pos){puts("No");continue;}  //判断有没有成环 
		
		int count = 0;                 //判断是不是所有的点共有一个根 
		for(int i = 1; i < maxn; i++)
		{
			
			if(num[i] && find(i) == i)
			{
				count++;
			}	
		}
		if(count==1) puts("Yes");
		else puts("No");
	}
	return 0;
}	

之前未AC代码:我的思路也写在里面:

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 100001
using namespace std;

int set[maxn],num[maxn];
int find(int x)
{
	if(set[x] == x)return x;
	return set[x] = find(set[x]);
}
int main()
{
	int n,m,pos;
	while(scanf("%d%d",&n,&m))
	{
		if(m==-1 && n==-1)break;
		if(m==0 && n==0){puts("Yes");continue;}
		memset(num,0,sizeof(num));
		num[n] = num[m] = 1; 
		for(int i =1; i <= maxn; i++)
			set[i] = i;
		pos = 0;
		if(find(n)==find(m))pos = 1;
		else 
			set[find(n)] = find(m);
		while(scanf("%d%d",&n,&m),(n&&m))
		{
			num[n] = num[m] = 1; 
			if(find(n)==find(m))pos = 1;
			else
				set[find(n)] = find(m);
		}
		//////////////////////////////只有下面几行不同;
		/////这样做的思路是用pos总的来判断要输出Yes还是No 
		int count = 0;                 
		for(int i = 1; i < maxn; i++)
		{
			if(count > 1)
			{
				pos = 1;  //如果形成的迷宫不只一个根节点,则pos为1;最后判断就会输出No 
				continue;
			} 
			if(num[i] && find(i) == i)
			{
				count++;
			}	
		}
		if(pos) puts("No");
		else puts("Yes");
	}
	return 0;
}	



posted @ 2012-12-05 22:20  简洁是智慧的灵魂  阅读(105)  评论(0)    收藏  举报