1. 程式人生 > >HDU-1878-歐拉回路(並查集)

HDU-1878-歐拉回路(並查集)

歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?

Input

測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結
束。

Output

每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。

Sample Input

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0

Sample Output

1
0
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int pre[1005],cnt,du[1005];
void init()//初始化 
{
	memset(du,0,sizeof(du));
	for(int i = 1; i <= n; i ++)
		pre[i] = i;
}
int root(int x)//查 
{
	if(x!=pre[x])
		pre[x] = root(pre[x]);
	return pre[x];
}
void merge(int x,int y)//並 
{
	int fa = root(x);
	int fb = root(y);
	if(fa!=fb)
	{
		cnt--;
		pre[fa] = fb;
	}
}
int main()
{

	while(~scanf("%d",&n)&&n)
	{
		init();
		cnt = n-1;
		scanf("%d",&m);
		for(int i=0;i<m;++i)
		{
			int x,y;
			scanf("%d %d",&x,&y);
			du[x]++;
			du[y]++;
			merge(x,y);
		}
		if(cnt)//如果邊沒有都輸入過,說明肯定不連通 
		{
			printf("0\n");
			continue;
		}
		int flag = 1;
		for(int i = 0; i < n; i ++)
		{
			if(du[i]%2)//這條邊出現了不是偶數次 
			{
				flag = 0;
				break;
			}
		}
		if(flag)
			printf("1\n");
		else
			printf("0\n");
		} 
}