1. 程式人生 > >hdoj1878歐拉回路

hdoj1878歐拉回路


Problem Description 歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?
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<cstdio>
#include<cstring>
int du[1100],par[1100];
int find(int x)
{
    if(par[x]==x) return x;
    else
    return par[x]=find(par[x]);
}
int unite(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		par[fx]=fy;
	 } 
}
int main()
{
	int n,m,i,u,v;
	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)
		par[i]=i;
		scanf("%d",&m);
		memset(du,0,sizeof(du));
		while(m--)
		{
			scanf("%d%d",&u,&v);
			unite(u,v);
			du[u]++;
			du[v]++;
		}
		for(i=1;i<=n;i++)
		{
			if(du[i]%2==1||find(i)!=par[1])
			break;
		}
		if(i>n)
		printf("1\n");
		else
		printf("0\n");
		
	}
}