七橋問題--歐拉(算法競賽入門經典)


一 七橋問題的結論:

如果一個圖是連通(無向圖)的,且最多只有兩個奇點(奇點數目為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

下面我們看看本題程序執行結果:

由結果可見我們的路徑輸出是逆序的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM