hud 1878 歐拉回路的判定
阿新 • • 發佈:2019-01-27
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)任何一點的度數都應該是偶數
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)任何一點的度數都應該是偶數
程式碼如下:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int fa[10005],du[10005]; int n,m; void init() { for(int i=1;i<=n;i++) { du[i]=0; fa[i]=i; } } int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } void add(int a,int b) { a=find(a); b=find(b); if(a!=b) { fa[b]=a; } } int main() { int a,b; while(~scanf("%d",&n)) { int flag=1; if(n==0) break; scanf("%d",&m); init(); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); ++du[a]; ++du[b]; add(a,b); } int sum=0; for(int i=1;i<=n;i++) { if(fa[i]==i&&du[i]!=0) sum++; } //printf("(%d)\n",sum); if(sum>1) { printf("0\n"); continue; } for(int i=1;i<=n;i++) { if(du[i]%2) { flag=0; break; } } if(flag==1) printf("1\n"); else printf("0\n"); } return 0; }