首先感謝@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 不應該...