尤拉迴路 尤拉路徑 理解 好

2021-08-30 15:55:28 字數 2628 閱讀 1833

farmer john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。

john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被經過一次。john能從任何乙個頂點(即兩個柵欄的交點)開始騎馬,在任意乙個頂點結束。

每乙個柵欄連線兩個頂點,頂點用1到500標號(雖然有的農場並沒有500個頂點)。乙個頂點上可連線任意多(>=1)個柵欄。兩頂點間可能有多個柵欄。所有柵欄都是連通的(也就是你可以從任意乙個柵欄到達另外的所有柵欄)。

你的程式必須輸出騎馬的路徑(用路上依次經過的頂點號碼表示)。我們如果把輸出的路徑看成是乙個500進製的數,那麼當存在多組解的情況下,輸出500進製表示法中最小的乙個 (也就是輸出第一位較小的,如果還有多組解,輸出第二位較小的,等等)。

輸入資料保證至少有乙個解。

輸入格式:

第1行: 乙個整數f(1 <= f <= 1024),表示柵欄的數目

第2到f+1行: 每行兩個整數i, j(1 <= i,j <= 500)表示這條柵欄連線i與j號頂點。

輸出格式:

輸出應當有f+1行,每行乙個整數,依次表示路徑經過的頂點號。注意資料可能有多組解,但是只有上面題目要求的那一組解是認為正確的。

輸入樣例#1:

9

1 22 3

3 44 2

4 52 5

5 65 7

4 6

輸出樣例#1:

123

4254657

題目翻譯來自nocow。

usaco training section 3.3

solution:

來系統地整理一下有關尤拉迴路和尤拉路徑的問題。

什麼是尤拉路徑?在圖上用一種走法經過所有的邊一次且只有一次的路徑叫做尤拉路徑。即一筆畫。

如果這條路徑的起點和終點重合,那麼就是尤拉迴路。

如何判斷圖是否有尤拉迴路或者尤拉路徑?

無向圖:因為尤拉路徑中,除了起點與終點以外,任意點的「進」「出」次數相等,所以除了兩個點為奇點(度數為奇數的點)(終點和起點)以外,其它點的度數均為偶數。

如果是尤拉迴路,奇點的個數應該為0。

有向圖:尤拉路徑中,最多只有兩個點的入度不等於出度。起點出度比入度大1,終點入度比出度大1。

如果是尤拉迴路,所有點的 入度=出度 。

尋找尤拉迴路或尤拉路徑的演算法有?

fluery演算法和hierholzer演算法。後者好像也有部落格稱逐步插入迴路法。

後面一種演算法無論是程式設計複雜度還是時間複雜度好像都比前種演算法複雜度更優,但前者的應用廣泛性好像比後者更高。尤拉迴路的更高階的應用還沒涉及,如果之後有什麼新內容再來補充吧....所以這裡就用hierholzer演算法了。

hierholzer演算法自動尋找尤拉迴路,在找不到尤拉迴路的情況下會找到尤拉路徑。前提是得給它指定好起點。

演算法流程(無向圖):

1.判斷奇點數。奇點數若為0則任意指定起點,奇點數若為2則指定起點為奇點。

2.開始遞迴函式hierholzer(x):

迴圈尋找與x相連的邊(x,u):

刪除(x,u)

刪除(u,x)

hierholzer(u);

將x插入答案佇列之中

3.倒序輸出答案佇列

對於該圖,演算法的執行流程如下:

1.找到該圖沒有奇點,從1開始進行hierholzer演算法。

2.刪邊1-2 遞迴到2

3.刪邊2-3 遞迴到3

4.刪邊3-7 遞迴到7

5.刪邊7-1 遞迴到1

6.1無邊,1加入佇列,返回

7.7加入佇列,返回

8.刪邊3-4 遞迴到4

9.刪邊4-5 遞迴到5

10.刪邊5-6 遞迴到6

11.刪邊6-3 遞迴到3

12.3加入佇列,返回

13.6加入佇列,返回

14.5加入佇列,返回

15.4加入佇列,返回

16.3加入佇列,返回

17.2加入佇列,返回

18.1加入佇列,返回

答案隊列為:1 7 3 6 5 4 3 2 1。反向輸出即為答案。

有向圖除判斷是否存在有一點點不同以外同理。

對於該題【尤拉路徑/尤拉迴路】模板題,要求輸出答案的最小序列。所以起點首先要選的盡量小,然後在邊的儲存上面加一點小trick。

使用鄰接表儲存圖時,除了用鏈式前向星還可以用vector儲存。我們可以把vector換成multiset,這樣就可以保證該點前往的下乙個點是最小值,同時保證了答案的最小值。

下面是該題的**:

#includeusing namespace std;

const int n=1025;

multisetto[n];

int len[n];

int road[n],k;

void dfs(int x)

road[k++]=x;//往答案佇列裡插入答案

}int main()

尤拉路徑 尤拉迴路

尤拉迴路 連通圖,一條路徑恰好經過所有邊一次,並且構成迴路 起點終點相同 尤拉路徑 連通圖,一條路徑恰好經過所有邊一次 起點終點不必相同 具有尤拉迴路的圖稱尤拉圖,具有尤拉路徑但不具有尤拉迴路的圖稱半尤拉圖 無向圖尤拉迴路的判斷 連通圖,所有頂點度數均為偶數 無向圖尤拉路徑的判斷 連通圖,只有兩頂點...

尤拉迴路 尤拉路徑

尤拉路徑 如果圖 g 種的一條路徑包括所有的邊,且僅通過一次的路徑.尤拉迴路 能回到起點的尤拉路徑.混合圖 既有無向邊又有無向邊的圖.hierholzer演算法自動尋找尤拉迴路,在找不到尤拉迴路的情況下會找到尤拉路徑。前提是得給它指定好起點。演算法流程 無向圖 1.判斷奇點數。奇點數若為0則任意指定...

尤拉迴路 尤拉路徑題目

2092 尤拉迴路 時間限制 1 sec 記憶體限制 32 mb 提交 6 解決 5 提交 狀態 討論版 命題人 外部匯入 題目描述 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?輸入 測試輸入包含若干測試用例。每個測試用例的第1行給...