1. 程式人生 > >HDU 1878-歐拉回路(簡單的歐拉回路判斷)

HDU 1878-歐拉回路(簡單的歐拉回路判斷)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1878

歐拉回路

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


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
//判斷是否存在歐拉回路
//無向圖G存在尤拉通路的充要條件是:
//G為連通圖,並且G僅有兩個奇度結點(度數為奇數的頂點)或者無奇度結點。

//有向圖D存在尤拉通路的充要條件是:
//D為有向圖,D的基圖連通,並且所有頂點的出度與入度相等;
//或者  除兩個頂點外,其餘頂點的出度與入度都相等,
//而這兩個頂點中一個頂點的出度與入度之差為1,另一個頂點的出度與入度之差為-1.

//無向圖G存在歐拉回路的充要條件是:
//G為連通圖,並且G無奇度結點。

//有向圖D存在歐拉回路的充要條件是:
//D為有向圖,D的基圖連通,並且所有頂點的出度與入度相等;
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 1110
using namespace std;

int vis[maxn];
int edge[maxn][maxn];
int num[maxn];
int N;
void dfs(int top)
{
	vis[top] = 1;
	for(int i=1; i<=N; i++)
		if(edge[top][i]&&!vis[i])
			dfs(i);
}
int main()
{
	while(scanf("%d", &N), N)
	{
		int M;
		scanf("%d", &M);
		memset(vis, 0, sizeof(vis));
		memset(num, 0, sizeof(num));
		memset(edge, 0, sizeof(edge));
		for(int i=0; i<M; i++)
		{
			int a, b;
			scanf("%d%d", &a, &b);
			//這裡需注意,我wa了3發才發現,就是說,可以多次輸入同樣的a和b, 即a和b之間是有多條路的
            num[a]++;
            num[b]++;
			edge[a][b] = edge[b][a] = 1;
		}
		int ok = 1;
		for(int i=1; i<=N; i++)
		{
			if(num[i]%2)
				{
				    ok = 0;
				    break;
				}
		}
		if(ok==0)
			printf("0\n");
		else
		{
			dfs(1);
			for(int i=1; i<=N; i++)
				if(vis[i]==0)
				{
					ok = 0;
					break;
				}
			printf("%d\n", ok);
		}
	}
	return 0;
}


推薦歐拉回路學習地址:http://blog.csdn.net/nameix/article/details/52288755