hdu 歐拉回路(判斷)
阿新 • • 發佈:2019-02-09
通過圖中所有邊1次且僅1次行遍所有頂點的通路稱作尤拉通路。
通過圖中所有邊1次且僅1次行遍所有頂點的迴路稱作歐拉回路。
具有歐拉回路的圖稱為尤拉圖。
具有尤拉通路而無歐拉回路的圖成為半尤拉圖。
無向圖:
G是尤拉圖當且僅當G是是連通圖且沒有奇度頂點
G是半尤拉圖當且僅當G是連通圖恰有2個奇度頂點
有向圖:
D是尤拉圖當且僅當D是強連通且每個頂點的入度等於出度。
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<iostream> #include<cstring> #include<vector> #include<cstdio> #include<cstring> using namespace std; vector<int> g[1010]; bool visited[1010]; int n; void dfs(int u) { visited[u]=1; for(int i=0;i<g[u].size();i++) if(!visited[g[u][i]]) dfs(g[u][i]); } int main() { while(cin>>n) { if(n==0) return 0; int m; cin>>m; memset(visited,0,sizeof(visited)); for(int i=0;i<=1000;i++) g[i].clear(); for(int i=0;i<=m-1;i++) { int a,b; scanf("%d%d",&a,&b); g[a].push_back(b); g[b].push_back(a); } int cnt=0; for(int i=1;i<=n;i++) { if(!visited[i]) { cnt++; if(cnt>1) break; dfs(i); } } bool flag=0; for(int i=1;i<=n;i++) if(g[i].size()%2==1) { flag=1; break; } if(cnt==1&&flag==0) cout<<1<<endl; else cout<<0<<endl; } return 0; }