資料結構實驗之圖論八:歐拉回路__DFS
阿新 • • 發佈:2018-12-09
Problem Description
在哥尼斯堡的一個公園裡,有七座橋將普雷格爾河中兩個島及島與河岸連線起來。
能否走過這樣的七座橋,並且每橋只走一次?瑞士數學家尤拉最終解決了這個問題並由此創立了拓撲學。尤拉通過對七橋問題的研究,不僅圓滿地回答了哥尼斯堡七橋問題,並證明了更為廣泛的有關一筆畫的三條結論,人們通常稱之為尤拉定理。對於一個連通圖,通常把從某結點出發一筆畫成所經過的路線叫做尤拉路。人們又通常把一筆畫成回到出發點的尤拉路叫做歐拉回路。具有歐拉回路的圖叫做尤拉圖。
你的任務是:對於給定的一組無向圖資料,判斷其是否成其為尤拉圖?
Input
連續T組資料輸入,每組資料第一行給出兩個正整數,分別表示結點數目N(1 < N <= 1000)和邊數M;隨後M行對應M條邊,每行給出兩個正整數,分別表示該邊連通的兩個結點的編號,結點從1~N編號。
Output
若為尤拉圖輸出1,否則輸出0。
Sample Input
1
6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6
Sample Output
1
Hint
如果無向圖連通並且所有結點的度都是偶數,則存在歐拉回路,否則不存在。
AC程式碼:
#include<bits/stdc++.h> using namespace std; int mp[1001][1001],vis[1001],dis[1001]; int n,m,sum; void DFS(int x) { vis[x]=1; sum++; for(int i=1; i<=n; i++) { if(mp[x][i]==1&&vis[i]==0) DFS(i); } } int main() { int T,u,v; cin>>T; while(T--) { sum=0; memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); cin>>n>>m; while(m--) { cin>>u>>v; mp[u][v]=mp[v][u]=1; dis[u]++,dis[v]++; } DFS(u); int i; for(i=1; i<=n; i++) { if(dis[i]%2==1) break; } if(i==n+1&&sum==n) cout<<"1\n"; else cout<<"0\n"; } return 0; }
————
餘生還請多多指教!