尤拉迴路 尤拉路 學習筆記

2022-03-12 13:02:36 字數 1520 閱讀 7840

來補乙個小小的科技/cy

先咕著,切完ejoi再來填/doge

upd 2020.7.23:前來填坑。u1s1 填坑是真心難受,以後爭取不做鴿子(flag

若乙個迴路經過一張圖的每條邊恰好一次,那麼這個迴路稱為這張圖的尤拉迴路。

若一條起終點不同的路徑經過一張圖的每條邊恰好一次,那麼這條路徑稱為這張圖的尤拉路。

無向圖/有向圖的尤拉迴路/尤拉路(一共四種情況)的求法是類似的。

首先按照上述判定找到起點,然後dfs。

考慮從起點開始dfs。每到達乙個節點,就選擇連線當前點的任意一條未走過的邊(對於有向圖則是出邊)(若沒有則退出),將它標記成走過並沿它走出去,dfs到下乙個節點,回溯時直接返回。也就是說在此節點只往外走一次,其他邊不管了,反正其他邊的話,將來會回到此節點繼續走的。不過這是精神勝利法,反例還是能找出,比如下圖,以無向圖尤拉迴路為例:

在上圖中,已標號邊的是已經走過的。從\(1\)開始,走到\(5\)的時候,它選擇了走到\(4\)並回\(1\)而非走到\(6/7\)。這樣一回去,哦吼,無路可走了。不難證明,遇到這樣的情況後,把所有沒走過的邊,帶著所有連線的點給抽出來得到一張子圖,這個子圖一定有尤拉迴路/尤拉路(你要求啥就有啥)。假設我們已經找到了這個子圖的尤拉迴路/尤拉路,那麼剩下來的事情就是將當前環和子圖的尤拉路/尤拉迴路合併起來。很顯然,將子圖的尤拉路/尤拉迴路在連線處嵌入當前環是一種合併方法,如下圖:

具體嵌入方法是:每次dfs回溯的時候不立即返回,取而代之的是將「將此邊資訊壓入尤拉迴路/尤拉路序列(即要求的東西)」這個操作放到回溯的時候完成,並繼續找下一條鄰接表中的未走過的邊。這樣最後尤拉迴路/尤拉路序列是倒序的,reverse一下即可。正確性很好理解,進入子圖之前顯然是回溯回來的,此時已將所有在子圖之後走過的邊壓入,緊接著就將子圖壓入,再按環的順序倒退回去,將在子圖之前走過的邊壓入。

最後說一句,我們可以類似網路流裡的當前弧優化(我知道這個是因為以前學過網路流,現在忘掉內容了,只記得這個名字),實時記錄當前走到當前點鄰接表中的哪條邊了。另外,對於無向圖中的刪邊,我們要將鄰居鄰接表中連向自己的邊也一併標記掉,我們可以預先開跟鄰接表大小相等的反邊vector。至於鏈式前向星,個人不喜歡那東西。

時間線性。

下面是簡短的**:

vectorpa;//edge是儲存邊資訊的型別

void dfs(int x=st){//st為找出的起點

for(int &i=now[x];icodeforces 1361c - johnny and megan's necklace

題解傳送門

洛谷 p6305 - 迴圈排序

題解傳送門

這個聽說要網路流/jk,暫時不會,留坑,嗷嗷待補。

尤拉迴路,尤拉路

參考以上 判斷尤拉路,尤拉迴路 注意圖聯通,可以dfs 或者並查集 一 無向圖 尤拉迴路 每個頂點度數都是偶數 尤拉路 所有點度數為偶數,或者只有2 個點度數為奇數 二 有向圖 非混合 尤拉迴路 每個頂點入度等於出度 尤拉路 每個頂點入度等於出度 或者只有1 個點入度比出度小 1,從這點出發,只有 ...

尤拉路 尤拉迴路

1 尤拉路 在乙個連通圖中存在一條路,經過途中所有邊一次且僅一次,這條路叫做尤拉路。2 尤拉迴路 在乙個連通圖中存在一條路,經過途中所有邊一次且僅一次,出發點亦是終點,這樣的路是尤拉迴路。1 無向圖有一條尤拉路 圖是連通的,且全部的結點的度是偶數 就是尤拉迴路的情況 或只有兩個結點的度是奇數。2 無...

尤拉路和尤拉迴路

尤拉環 圖中經過每條邊一次且僅一次的環 尤拉路徑 圖中經過每條邊一次且僅一次的路徑 尤拉圖 有至少乙個尤拉環的圖 半尤拉圖 沒有尤拉環,但有至少一條尤拉路徑的圖。無向圖 乙個無向圖是尤拉圖當且僅當該圖是連通的 注意,不考慮圖中度為0的點,因為它們的存在對於圖中是否存在尤拉環 尤拉路徑沒有影響 且所有...