尤拉迴路小記

2022-06-30 01:48:07 字數 1369 閱讀 3801

都初三了還不會這個就有點丟人了吧

乙個相當 water 的東西哦/doge

對於圖 \(g=(v,e)\),給出以下定義:

尤拉迴路:圖 \(g\) 中經過每條邊恰好一次的迴路

尤拉路徑:圖 \(g\) 中經過每條邊恰好一次的路徑

這裡不加證明地給出以下定理:

無向圖的情況

有向圖的情況

類似地,我們也得到的有向圖的尤拉路徑/迴路的判定方式:

無向圖/有向圖的尤拉迴路/尤拉路的求法是類似的,知道其中乙個的求法也就能順帶著推出另外三個的求法,這裡以無向圖的尤拉迴路的求法為例。

首先任選乙個點為起點(由於是尤拉迴路,任選乙個點為起點都沒問題,如果是尤拉路徑的情況就按照上面判定的思路找到起點),然後重複以下的操作:從起點開始 dfs,每次訪問乙個節點 \(u\),就遍歷它的鄰居找到乙個未訪問過的邊 \((u,v)\) 並從 \(v\) 點繼續 dfs 下去並標記 \((u,v)\) 為「已經訪問過」,不難證明我們從 \(v\) 開始 dfs 下去的過程中一定會回溯到 \(u\),也就是從 dfs \(v\) 到回溯到 \(u\) 的部分一定還是乙個尤拉迴路(否則假設 \(v\) 到達某個點 \(w\) 之後無路可走了,那麼在這之前由於每次訪問 \(w\) 都是從某個點到達 \(w\),再從 \(w\) 走向某個點,會消滅掉 \(2\) 條與 \(w\) 相連的邊,而這次訪問到 \(w\) 時只消滅了一條與 \(w\) 相連的邊,之後 \(w\) 的度數就變為 \(0\) 了,也就是說 \(w\) 的度數為奇數,與尤拉迴路的條件「所有點的度數都是偶數」矛盾)。回溯的時候就將邊 \((u,v)\) 的資訊壓入 dfs 序列。正確性顯然。

不過這個做法的複雜度是錯誤的,比方說下圖:

不難發現我們回溯到 \(1\) 的次數為 \(10^5\),而我們每次回溯到 \(1\) 都要從頭開始尋找第乙個未訪問過的邊,也就是說當我們訪問最後幾個環的時候這個訪問次數最高可達 \(10^5\),時間複雜度也就退化到了 \(10^5\times 10^5=10^\),直接**。這裡可以借鑑網路流中「當前弧優化」的思想,記錄乙個 \(now_x\) 表示當前訪問到了哪條邊,每次尋找第乙個未訪問過的邊時就從 \(now_x\) 開始遍歷即可,這樣複雜度就降到了 \(\mathcal o(|e|)\)。相信學過網路流的同學這一步都不難理解。

int hd[maxn+5],to[maxn*2+5],nxt[maxn*2+5],ec=1;//邊從 1 開始編號

bool used[maxn+5];vectorret;

void adde(int u,int v)

void cir(int x)

}

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

有向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...