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

2021-10-19 05:29:49 字數 1153 閱讀 6510

尤拉迴路:遍歷所有邊一次且行遍所有頂點的迴路

尤拉通路:遍歷所有邊一次且行遍所有頂點的通路

尤拉圖:具有尤拉迴路的圖

半尤拉圖:具有尤拉通路的圖

尤拉圖:每個點度數都為偶數,相當於很多個環交叉起來。

半尤拉圖:僅有兩個點度數為偶數,相當於一條邊連著兩個尤拉圖。

核心部分長這樣

void

dfs(

int x)

ans.

push_back

(x);

}

證明:

小問題:記得一開始寫題的時候總是糾結為啥要先dfs

dfsdf

s再壓棧,為什麼不先壓棧再dfs

dfsdf

s。先壓棧再dfs

dfsdf

s用上面的遞迴思路證明不是一樣的嗎?

答:因為假設起點為x

xx,那麼拆x

−>

yx->y

x−>

y這條邊後有兩種可能

新的以y

yy為起點的圖與x

xx連通。如果每次拆邊都是這樣的結果,那麼先壓棧再遞迴當然沒錯。

新的以y

yy為起點的圖與x

xx不連通。如1

−>2,

1−

>3,

3−

>

11->2,1->3,3->1

1−>2,

1−>3,

3−>

1,這樣的圖,拆掉了1

−>

21->2

1−>

2這條邊以後以2位起點的子圖與原來的圖不連通。因此先壓棧再dfs

dfsdf

s實際保證了這種情況不連通子圖的路徑在棧中相對下面,這樣就等價於先遍歷x

xx其他出邊並回到x

xx再遍歷這個子圖。

leetcode 332. 重新安排行程(最小字典序尤拉迴路)

leetcode 753. 破解保險箱(有向尤拉圖,計算機解碼)

尤拉迴路 輸出尤拉迴路的路徑

有向or無向均可,重邊 step1 從u開始,找到與他相連的v,放入棧,刪除 u,v 這條邊,然後從v開始 step2 當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續開始找點刪邊。最後記得把棧裡的點放到path中。path倒序輸出 需要先找到起點 鄰接表法,適合稀疏圖 incl...

尤拉迴路 UOJ117 尤拉迴路 題解

判斷無向圖和有向圖是不是尤拉迴路。如果是,求出任意一條尤拉迴路。判斷尤拉迴路 證明?我不會啊!怎麼求尤拉迴路呢?因為已經確定了是尤拉迴路,所以我們可以直接dfs瞎搞。隨便從乙個點開始dfs,一條邊走過後就刪除。回溯時將其入隊。最後的佇列反過來就是答案。原理 最後的佇列是返回路徑,所以反過來就是答案。...

HDU 1878 尤拉迴路(判斷尤拉迴路)

題目大意 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?解題思路 判斷無向圖是否存在尤拉迴路,判斷每個點的度數是否為偶數 並查集確認連通性。1 include2 include3 include4 define clr arr,val...