一 七橋問題的結論:
如果一個圖是連通(無向圖)的,且最多只有兩個奇點(奇點數目為0或者2),則一定存在歐拉回路。如果有兩個奇點,則必須從其中一個奇點出發,另一個奇點終止;如果奇點不存在,則可以在任意點出發,最終一定會回到該點。(路徑不能重復)
如果圖是有向圖,最多只能有兩個點的入度不等於出度,而且必須是其中一個點的出度恰好比入度大1(作為起點),另一個點的入度比出度大1(作為終點)。當然必須注意前提條件,那就是圖必須連通。
下面貼上ac代碼:
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 #define maxn 1000 5 int g[maxn][maxn],vis[maxn][maxn],n,m; 6 void uler(int u) 7 { 8 for(int v=0;v<n;v++) 9 if(g[u][v]&&!vis[u][v]) 10 { 11 vis[u][v]=vis[v][u]=1;//無向圖如此處理,有向圖只需要把它改成vis[u][v]=1就行了 12 uler(v);//類似dfs,如果到這里為止,他所有的鄰接點都已經被訪問。 13 cout<<u<<' '<<v<<endl; 14 } 15 } 16 int main() 17 { 18 cin>>n>>m; 19 memset(g,0,sizeof(g)); 20 int u,v; 21 for(int i=0;i<m;i++) 22 { 23 cin>>u>>v; 24 g[u][v]=g[v][u]=1; 25 } 26 uler(1); 27 return 0; 28 29 }
本代碼中輸出的路徑是按照逆向輸出的,因此要輸出正向的路徑,需要引入棧,把(u,v)壓入棧,然后輸出。
本題我自己建立了一個樣例:
這是本題的原圖,我們建立如下的圖表存儲邊的關系
0 |
1 |
2 |
|
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
2 |
1 |
1 |
0 |
下面我們看看本題程序執行結果:
由結果可見我們的路徑輸出是逆序的。