什麼是尤拉路徑?尤拉路徑就是一條能夠不重不漏地經過圖上的每一條邊的路徑,即小學奧數中的一筆畫問題。而若這條路徑的起點和終點相同,則將這條路徑稱為尤拉迴路。
查詢尤拉路徑可以使用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 尤拉迴路定義 我們必須在圖中找出一條路徑,使得該路徑對圖的每條邊恰好訪問一次。如果我們要解決 附加的問...