九度OnlineJudge之1027:歐拉回路
阿新 • • 發佈:2019-02-17
題目描述:
歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?
- 輸入:
- 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結束。
- 輸出:
- 每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。
- 樣例輸入:
-
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
-
//歐拉回路(無向圖)經典解法:並查集+奇偶判斷 (有向圖也很簡單,只要將Degree標誌量拆分成inDegree和outDegree加之稍微變化一點的奇偶判斷即可)
- 樣例輸出:
-
1 0
-
#include <iostream> #define MAX 1001 using namespace std; int Tree[MAX]; int Degree[MAX]; int findRoot(int x) { if(Tree[x]==-1) return x; else { int tmp = findRoot(Tree[x]); Tree[x] = tmp; return tmp; } } int main() { int N; int M; while(cin>>N,N!=0) { cin>>M; for(int i=1;i<=N;++i) { Tree[i]=-1; Degree[i]=0; } int a,b; while(M--) { cin>>a>>b; ++Degree[a]; ++Degree[b]; int x = findRoot(a); int y = findRoot(b); if(x!=y) { Tree[x] = y; } } int ans = 0; int flag = 1; for(int i=0;i<=N;++i) { if(Tree[i]==-1) ans++; if(Degree[i]%2==1) flag=0; } if(ans!=1) flag=0; cout<<flag<<endl; } // system("PAUSE"); return 0; }