歐拉圖、歐拉路徑、Hierholzer 算法

歐拉圖、歐拉路徑、Hierholzer 算法

本文參考於【圖論】什麼是歐拉圖?如何求歐拉路徑?

不嚴謹的定義

對於一個連通的圖G,有:
歐拉路徑: 一條路徑,它能夠不重複地遍歷完所有的邊。這個性質很像不重複地一筆畫完所有邊,所以有些涉及到歐拉路徑的問題叫做一筆畫問題。
歐拉回路: 一條路徑,它能夠不重複地遍歷完所有的邊,並且回到起點。可以看出歐拉回路也是歐拉路徑。
半歐拉圖: 一個圖,圖中存在歐拉路徑。
歐拉圖: 一個圖,圖中存在歐拉回路。可以看出歐拉圖也是半歐拉圖。

圖與歐拉路徑、歐拉回路的結論

連通的無向圖爲(半)歐拉圖的條件:
1.若所有頂點的度爲偶數,則能夠找到從任意頂點出發的歐拉回路。反之也成立,即若能夠找到從任意頂點出發的歐拉回路,則所有頂點的度爲偶數。

2.若有且僅有2個頂點的度數爲奇數,則只能夠找到歐拉路徑(路徑從這兩點中的任一頂點出發,到另一頂點結束)。反之也成立。

連通的有向圖爲(半)歐拉圖的條件:
1.若所有頂點的入度等於出度,則能夠找到從任意頂點出發的歐拉回路。反之也成立。

2.若有且僅有兩個頂點入度不等於出度,其中一個頂點入度比出度大1,記爲V1,另一個頂點入度比出度小1,記爲V2​,則只能夠找到歐拉路徑(路徑從頂點V2​出發,到頂點V1結束)。反之也成立。

連通的混合圖爲(半)歐拉圖的條件:(混合圖是指既有有向邊又有無向邊的圖。)
找到一個給每條無向的邊定向的策略,使得每個頂點的入度等於出度,這樣就能轉換成有向圖的情況。(這個有待考究)

Hierholzer 算法

問題簡述: 給定一個(半)歐拉圖,求歐拉路徑。

Hierholzer 算法思想:
當給定的圖一定有歐拉路徑(迴路)時,從一個合理的起始點出發(後面會說什麼是合理的),深度優先遍歷整個圖,遍歷過的頂點都不得再遍歷,直到遇到的第一個沒有可遍歷的鄰居的頂點,這個頂點一定是某條歐拉路徑的終點,把這個頂點“刪掉”(實際上不用刪,通過標記邊已訪問就可以不再訪問它)後,下一次遇到的沒有可遍歷的鄰居的頂點,一定是這條歐拉路徑倒數第二個頂點,再把這個頂點“刪掉”再遍歷,以此類推,直到把所有沒有可遍歷的鄰居的頂點找到,我們就找到了這條歐拉路徑上的所有頂點。

問題1:
可能有人會奇怪,Hierholzer 算法爲什麼一定能得到歐拉路徑?爲什麼每遇到沒有可遍歷的鄰居的頂點就是歐拉路徑上的一個終點?下面以有向圖作爲說明,無向圖同理。這個其實涉及到一個頂點的出度和入度問題。

若從某個頂點開始遍歷,遍歷過的邊不能再遍歷,直到無邊可遍歷爲止,當遇到另一個出度等於入度的頂點V
時,是不可能停留在V的,因爲出度等於入度,你進入多少次,一定有對應的出邊讓你出去多少次。

因此第一個遇到的沒有可遍歷的鄰居的頂點只有兩種,一種是它的入度比出度大一,另一種是它的入度與出度相等,但是它是起點(也就是說既是起點又是終點,饒了一圈)。根據前面所說的一些結論(圖與歐拉路徑、歐拉回路的結論),這兩種點都是某條歐拉路徑上的終點,所以當我們遇到的沒有可遍歷的鄰居的頂點,儘管放心大膽的把該頂點記錄下來,因爲它一定是歐拉路徑的終點。

問題2:
可能還有人會奇怪,爲什麼遇到的第二個沒有可遍歷的鄰居的頂點是歐拉路徑倒數第二個點?
我們可以想象一下,我把第一個沒有可遍歷的鄰居的頂點以及對應的邊“刪掉”後(實際也可以不刪,只需標記已經訪問過就行),它相鄰頂點的出度和入度就會發生變化,在草稿紙畫一下你就會發現,它周圍的頂點要麼變成出度等於入度的頂點,要麼變成入度比出度大1的頂點,他們都符合成爲歐拉路徑的終點的條件,並且由於我們是遞歸地深度優先遍歷,遞歸返回上一層後,一定是在這些相鄰頂點之中,所以這時候遇到的第二個沒有可遍歷的鄰居的頂點,一定是歐拉路徑倒數第二個點。

Hierholzer 算法過程:
選擇一個合理的點作爲起始點,遍歷所有相鄰邊。(一會說什麼是合理的點)
深度優先搜索,訪問相鄰頂點。將經過的邊都不能再訪問。
如果當前頂點沒有相鄰邊,則將頂點入數組末尾。
最後將數組倒序輸出,就是從起點出發的歐拉回路。

Hierholzer 算法作用:
Hierholzer 算法就是證明了,當給定的圖一定有歐拉路徑(迴路)時,按照Hierholzer 算法無腦深度優先搜索,就一定會得到歐拉路徑(迴路)的逆序。至於得到的是歐拉路徑還是歐拉環路,取決於你的圖是歐拉圖還是半歐拉圖,若圖爲歐拉圖,得到的是歐拉環路,若圖是半歐拉圖,得到的則是歐拉路徑。

注意: 若圖不是歐拉圖也不是半歐拉圖,採用Hierholzer 算法得到的結果必定錯誤。所以在貿然採用Hierholzer 算法前,我們需要先按照前面說的圖與歐拉路徑、歐拉回路的結論判斷圖到底是不是(半)歐拉圖,若是,才能用該算法去找歐拉路徑(迴路)。

什麼是合理的起始點:
上面說到選擇合理的點作爲起始點,那麼什麼點是合理的?這裏需要回顧一下前面說的圖與歐拉路徑、歐拉回路的關係,以無向圖爲例(有向圖同理):

當圖爲歐拉圖時,能夠找到從任意點出發的歐拉回路,此時從任一點出發,都能找到歐拉回路,因此任何一點都是合理的;

當圖爲半歐拉圖時,有且僅有2個頂點的度數爲奇數,只能夠找到歐拉路徑(路徑從這兩點中的任一點出發,到另一點結束),此時只有從這兩點之一出發,才能找到歐拉路徑,因此只有這兩點是合理的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章