HDU 1878-歐拉回路(簡單的歐拉回路判斷)
阿新 • • 發佈:2019-02-14
題目連結: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