悠木皆守學會了一種古老的文字。
該文字共有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...