尤拉迴路(模板題)

2021-10-09 11:30:48 字數 1746 閱讀 3512

首先感謝@g20222222_tly學長提供的關於dfs的思路乙份。

在此之前,如果看過我之前寫的部落格的同學,不必擔心,只需要,忘記!

額,這道題,以平常的題目,過人的驚天資料來展示什麼叫毒瘤。

然後去看了一下題解, 自己又重碼了一遍,結果重新再來看的時候是一臉懵逼嗄。

然後想了將近一晚上的思路終於有了起色。

下面就是我的一些見解,和**

首先加入快讀,是因為原**是剛好卡著時間過的,

如果要按照,本人目前所學的東西來寫的話

直接超時,不用說了。

關於dfs最新的思路就是這樣的:

就是退回來的時候的邊塞進ans裡面,意思就是:

我們首先考慮就是無向邊會拆分成正反兩條邊,

第j

jj條邊,正向就是》

>

1>> 1

>

>

1,反向就是j

<

<1∣

1j << 1 | 1

j<

<1∣

1 若要在正反兩條邊上同時打乙個vis

visvi

s標記,就打在j

>

>

1j >> 1

j>

>1上。

~~ 以上來自tly學長思路 ~~

之後就是判斷是否是有向圖或無向圖, 如果都不是那就沒有尤拉迴路,而且如果圖不連通也是不存在的

最後就是將思路裡講的處理負數

/* 

當圖是無向圖時,尤拉迴路的存在條件為所有點的入度為偶數

當圖是有向圖時,尤拉迴路的存在條件是所有點的入度等於出度

求尤拉迴路時dfs所有邊 如果這條邊當前沒被標記過

那就標記這條邊,並且繼續向下深搜,把經過的邊存進陣列裡

同時要求實現有向圖和無向圖,無向圖就是多建了一些邊

回溯時存下所有邊

然後在返回輸出的時候處理負數

並且倒敘輸出

*/#include

#define maxn 100005

#define maxm 200005

using

namespace std;

int last[maxn]

;//儲存鏈式前向星

int ecnt =1;

//邊數

int cnt;

//奇度頂點個數的計數器

int ans[maxm]

;//儲存尤拉迴路

int in_deg[maxn]

, out_deg[maxn]

;//入度 ,出度

bool vis[maxm]

;//記錄有無關聯邊

intread()

while

(c >=

'0'&& c <=

'9')

return x * f;

}struct nodee[maxm <<1]

;void

add(

int a,

int b)

; last[a]

= ecnt;

}void

dfs(

int x)}}

intmain()

if(t ==1)

}else

}dfs

(a);

if(cnt != m)

else

}}

這個注釋和思路,大概率會有錯,如有問題,請指出!

尤拉迴路(HDU 1878) 尤拉迴路模板題

題目鏈結 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點...

模板 尤拉迴路

給定乙個無向圖,求一條恰好經過每條邊恰好一次的路徑.如果所有點度數均為偶數,存在尤拉迴路 如果有且僅有兩個點度數為奇數,存在以這兩個點為起點,終點的尤拉路.尤拉路是乙個連通圖,可以分解為一條點不相交的路徑 若干個環.直接搜尋,那麼出棧序列的逆序即為尤拉路.include include includ...

尤拉迴路Fleury演算法模板

1.fleury 佛羅萊 演算法 設g 為一無向尤拉圖,求g 中一條尤拉迴路的演算法為 1 任取g 中一頂點v0,令p0 v0 2 假設沿pi v0e1v1e2v2 eivi 走到頂點vi,按下面方法從e g 中選ei 1 a ei 1 與vi 相關聯 b 除非無別的邊可供選擇,否則ei 1 不應該...