hdu-1878-歐拉回路(並查集||dfs)&&歐拉回路
阿新 • • 發佈:2019-02-20
歐拉回路
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15494 Accepted Submission(s): 5924
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 code(dfs):
code(並查集):#include<cstring > #include<cstdio> using namespace std; const int N=1005; bool Map[N][N]; bool vis[N]; int ever[N],n,m; void dfs(int i) { vis[i]=true;///遍歷記錄是否訪問過 for(int k=1;k<=n;k++){ if(Map[i][k]){ if(!vis[k]) dfs(k); } } return ; } int main() { while(~scanf("%d",&n)&&n){ scanf("%d",&m); memset(Map,false,sizeof(Map)); memset(vis,false,sizeof(vis)); memset(ever,0,sizeof(ever)); for(int i=0;i<m;i++){ int x,y; scanf("%d %d",&x,&y); ever[x]++,ever[y]++;///記錄點的度,用於判斷奇偶度 Map[x][y]=Map[y][x]=true; } dfs(1); bool ok=true; for(int i=1;i<=n;i++) if(!vis[i]){ok=false;break;} if(!ok) printf("0\n"); else{ bool xx=true; for(int i=1;i<=n;i++) if(ever[i]%2){xx=false;break;} if(!xx) printf("0\n"); else printf("1\n"); } } return 0; }
#include<cstdio> #include<cstring> using namespace std; const int N=1005; int pre[N],ever[N]; bool tt[N]; int n,m; int Find(int x) { if(x==pre[x]) return x; else return pre[x]=Find(pre[x]); } void fun(int x,int y) { int fx=Find(x),fy=Find(y); if(fx!=fy) pre[fy]=fx; } int main() { while(~scanf("%d",&n)&&n){ memset(ever,0,sizeof(ever)); memset(tt,false,sizeof(tt)); for(int i=1;i<=n;i++) pre[i]=i; scanf("%d",&m); for(int i=0;i<m;i++){ int x,y; scanf("%d %d",&x,&y); ever[x]++,ever[y]++; fun(x,y); } int ok=0; for(int i=1;i<=n;i++) tt[Find(i)]=true; for(int i=1;i<=n;i++) if(tt[i]) ok++; if(ok!=1) printf("0\n"); else { bool xx=true; for(int i=1;i<=n;i++) if(ever[i]%2){xx=false;break;} if(!xx)printf("0\n"); else printf("1\n"); } } return 0; }