1. 程式人生 > >hdu 1272 小希的迷宮(並查集)

hdu 1272 小希的迷宮(並查集)

這題只要判斷一下有沒有環,並且要保證只有一個集合。

還有一個坑就是:x==0  y==0, 輸出yes。因為沒有點,也是符合要求的。

我這裡沒有用壓縮路徑,據說這題壓縮路徑會爆棧,如果爆棧的話,find裡面換用迴圈的方式寫就行了。

附上ac程式碼:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
const int Max = 1e5+5;
int pre[Max];
void init()
{
	for(int i=0;i<Max;i++)
	{
		pre[i]=i;
	}
}
int find(int x)
{
	int tmp = x;
	while(x!=pre[x])
	{
		x=pre[x];
	}
	pre[tmp]=x;
	return x;
}
void Union(int x,int y)
{
	int rootx = find(x);
	int rooty = find(y);
	if(rootx!=rooty)
	{
		pre[rootx]=rooty;
	}
}
int main()
{
	int x,y;
	int flag=1;
	set<int> st;
	while(1)
	{
		flag=1;
		int flag_0=0;    //判斷這一組中是否開始就 0 0
		int cnt=0;
		init();
		
		if(x==-1 && y==-1) break;
		while(scanf("%d%d",&x,&y))
		{
			if(cnt==0 && x==0 && y==0) 
			{
				flag_0=1;
				break;
			}
			cnt++;
			st.insert(x);
			st.insert(y);
			if(x==y) break;
			int rootx = find(x);
			int rooty = find(y);
			if(rootx == rooty) 
			
			{
				flag=0;
			
			}
			else
			{
				Union(x,y);
			}
		}
		if(x==-1 && y==-1) continue;
		//cout<<"len "<<st.size()<<endl;
		if(flag && st.size()==cnt+1 || flag_0 ==1) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
		st.clear();
		//printf("\n");
		getchar();
	}
	
	return 0;
 }