Hierholzer演算法尋找尤拉路徑

2021-10-23 21:59:32 字數 1512 閱讀 6537

什麼是尤拉路徑?尤拉路徑就是一條能夠不重不漏地經過圖上的每一條邊的路徑,即小學奧數中的一筆畫問題。而若這條路徑的起點和終點相同,則將這條路徑稱為尤拉迴路。

查詢尤拉路徑可以使用hierholzer演算法,以下題為例講解一下hierholzer演算法。

leetcode332重新安排

題目大意:給一組邊[fr

om,t

o][from,to]

[from,

to]表示許多段行程的起點和終點,開始起點是"jfk",輸出整個行程,要求字典序最小。

樣例輸入:[[「muc」, 「lhr」], [「jfk」, 「muc」], [「sfo」, 「sjc」], [「lhr」, 「sfo」]]

樣例輸出:[「jfk」, 「muc」, 「lhr」, 「sfo」, 「sjc」]

hierholzer演算法的核心思想是每次走過一條邊,刪除該邊;當我們遍歷完乙個節點所連的所有節點後,我們才將該節點入棧,將棧中的內容反轉,即可得到一筆畫結果。

我們結合下面2種情況理解一下演算法

從a開始遍歷,對於左邊的圖,先遍歷b,刪除a→

\rightarrow

→b;但是b沒有遍歷結束,又遍歷至a,刪除b→

\rightarrow

→a;然後至c,刪除a→

\rightarrow

→c;這時c先入棧;回溯至a,a的所有邊都被刪除了,a入棧;回溯至b,b的所有邊都被刪除了,b入棧;回溯至開始的a,a入棧。

對於右邊的圖,按照字典序,還是先遍歷b,刪除a→

\rightarrow

→b;b遍歷結束,b入棧;繼續從a遍歷c,刪除a→

\rightarrow

→c;c又到a,刪除c→

\rightarrow

→a,a的所有邊都被刪除了,a入棧;回溯至c,c的所有邊都被刪除了,c入棧;回溯至開始的a,a入棧。

有一定遞迴程式設計的基礎應該能理解上面2個例子,通過這2個例子可以直觀地理解hierholzer演算法為什麼能夠得到尤拉路徑。

leetcode332的題解如下,**中dfs

()dfs()

dfs(

)函式實現了hierholzer演算法的遍歷,答案為棧sta

stast

a的逆序。

class

solution

sta.

push_back

(cur);}

vector

finditinerary

(vector>

& tickets)

dfs(

"jfk");

reverse

(sta.

begin()

, sta.

end())

;return sta;}}

;

尤拉迴路 Hierholzer演算法 簡單筆記

尤拉迴路 遍歷所有邊一次且行遍所有頂點的迴路 尤拉通路 遍歷所有邊一次且行遍所有頂點的通路 尤拉圖 具有尤拉迴路的圖 半尤拉圖 具有尤拉通路的圖 尤拉圖 每個點度數都為偶數,相當於很多個環交叉起來。半尤拉圖 僅有兩個點度數為偶數,相當於一條邊連著兩個尤拉圖。核心部分長這樣 void dfs int ...

Hierholzer演算法 重新安排行程

尤拉跡是指一條包含圖中所有邊的一條路徑,該路徑中所有的邊會且僅會出現一次。乙個無向圖中包含尤拉跡,當且僅當下面兩條性質同時滿足 而乙個有向圖包含尤拉跡,當且僅當下面兩條性質同時滿足 hierholzer演算法用於在連通圖尋找尤拉跡,其流程非常簡單。從乙個可能的起點出發,進行深度優先搜尋,但是每次沿著...

DFS應用 尋找尤拉迴路

0.1 本文總結於 資料結構與演算法分析,源 均為原創,旨在 理解 dfs應用 尋找尤拉迴路 的idea 並用源 加以實現 源 我還沒有找到一種有效的資料結構和dfs進行結合,往後會po出 1.1 尤拉迴路定義 我們必須在圖中找出一條路徑,使得該路徑對圖的每條邊恰好訪問一次。如果我們要解決 附加的問...