考試題(尤拉迴路)

2021-08-29 20:43:23 字數 2421 閱讀 9465

悠木皆守學會了一種古老的文字。

該文字共有m 種不同的字元1; 2; : : : ; m。乙個簡單詞由兩個字元組

成(這兩個字元可以相同)。乙個複雜詞由若干個簡單詞組合而成;具體地,

對於乙個詞(可以是簡單詞或複雜詞)a1a2 · · · al 和另乙個簡單詞b1b2,如果

al = b1,那麼它們可以組合成乙個複雜詞a1a2 · · · alb2(因為al = b1 所以b1

被去掉了)。例如,如果用英文本母來表示字元,ab 和bc 可以組合成abc。

現在,悠木皆守有n 個簡單詞,第i 個詞是uivi,他想用每個詞恰好一次

(順序任意),將它們組合起來形成乙個複雜詞(注意,如果輸入的簡單詞有相

同的,那麼也要每個用一次)。

另外再輸入乙個引數t。若t = 1,則乙個簡單詞的兩個字元可以交換順

序,即uivi 可以當做viui 來使用(但只能使用這兩個中的乙個);如果t = 2,

則乙個簡單詞的兩個字元不能交換順序,只能作為uivi 使用。

這道題首先資料範圍1e5 的 2e5,如果n ^ 2的建圖肯定會t,那麼可以考慮把每個單詞看作邊,把數字看作點,這樣就變成了求乙個路徑能夠恰好覆蓋所有邊一次的,那麼就變成的尤拉路。

呃呃呃考慮如何快速的求尤拉迴路,這裡有一篇題解講的非常好

這裡有個套圈法,每次先走到乙個不能再走的廢物節點,然後把邊/點壓進乙個棧來儲存,這樣一直找,最後倒序把棧中元素輸出就是答案了

判斷不合法:

對於無向圖,首先圖要聯通,然後要判斷奇點,若數量 > 2 或  =1,那麼不合法

要不然就有兩個奇點或沒有,有兩個的時候乙個作為出發點,乙個作為終點

沒有的時候還是尤拉迴路,隨便找乙個點作為起點即可

對於有向圖,圖還是要聯通,但是判斷圖聯通不能隨便選出發點了,要在找到合法出發點再進行dfs記錄數量,像無向圖一樣使用套圈法記錄迴路即可

**

#include#include#include#includeusing namespace std;

const int maxn = 8e5 + 5;

int t, n, m;

int read()

while (ch >= '0' && ch <= '9')

return rt * f;

}int cnt, nxt[maxn], tot = 1, tov[maxn], head[maxn], id[maxn];

int dgr[maxn], tmp[maxn], stk[maxn], s, top = 0, in[maxn], out[maxn];

bool vis[maxn], ar[maxn];

struct node a[maxn];

void add(int u, int v, int w)

void dfs(int u)

}void dfs1(int u, int e)

stk[++top] = id[e];

} void dfs2(int u, int e)

stk[++top] = id[e];

} int main()

for (int i = 1; i <= tot; i++) vis[i] = 0;

cnt = 0;

dfs(a[1].u);

if (cnt != cnt1)

for (int i = 1; i <= m; i++) vis[i] = 0;

int num = 0;

for (int i = 1; i <= n; i++)

if (num == 0) else if (num == 2) else

for (int i = 1; i <= tot; i++) vis[i] = 0;

dfs1(s, 0);

puts("yes");

for (int i = top - 1; i >= 1; i--)

} else

cnt = 0;

int num = 0;

bool flag = 0;

for (int i = 1; i <= m; i++) vis[i] = 0;

for (int i = 1; i <= n; i++)

if (in[a[i].v] != out[a[i].v])

} for (int i = 1; i <= tot; i++) vis[i] = 0;

if (flag)

if (num == 0) else if (num == 2) else

if (flag)

dfs2(s, 0);

if (cnt != cnt1)

puts("yes");

for (int i = top - 1; i >= 1; i--)

} return 0;

}

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

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