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

歐拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11723    Accepted Submission(s): 4301


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

歐拉回路:圖爲連通圖,且每個點的度數都爲偶數。

思路:(1)歐拉回路,需要用並查集,判斷是否在一棵樹上。(2)用mark [ ]數組記錄每個點的度。

若n個點在一棵樹上,且每個點的度都爲偶數,則說明爲歐拉回路,反之則不是。

My  solution:

/*2015.3.13*/

<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
int per[1030],ans1,ans2;
void chu()
{
	int i;
	for(i=1;i<1030;i++)
	per[i]=i;
    return ;	
}
int find(int x)
{
	int i,j,k;
	k=x;
	j=x;
	while(k!=per[k])
	k=per[k];
	while(j!=per[j])
	{
		i=per[j];
		per[j]=k;
		j=i;
	}
    return k;
}
void join(int x,int y)
{
	int fx,fy;
	fx=find(x);
	fy=find(y);
	if(fx!=fy)
	{
		per[fx]=fy;
	}
	return ;
}
int main()
{
	int i,j,k,n,m,cnt;
	int mark[2000];
	while(scanf("%d%d",&n,&m)==2&&n)
	{
	
			chu();
			cnt=0;
			memset(mark,0,sizeof(mark));
			for(i=1;i<=m;i++)
			{
				scanf("%d%d",&j,&k);
				mark[j]+=1;
				mark[k]+=1;
				join(j,k);
			}
			for(i=1;i<=n;i++)
			if(i==per[i])
			cnt++;
		     for(i=1;i<=n;i++)
		     if(mark[i]%2)
		     break;
		     if(i>n)
		     {
		     	if(cnt==1)
		     	printf("1\n");
		     	else
			    printf("0\n");
			 }
			else
			printf("0\n");
	}
	return 0;
}


發佈了144 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章