尤拉迴路 UOJ117 尤拉迴路 題解

2021-08-14 15:22:39 字數 1236 閱讀 5234

判斷無向圖和有向圖是不是尤拉迴路。如果是,求出任意一條尤拉迴路。

判斷尤拉迴路:

證明?我不會啊!怎麼求尤拉迴路呢?因為已經確定了是尤拉迴路,所以我們可以直接dfs瞎搞。隨便從乙個點開始dfs,一條邊走過後就刪除。回溯時將其入隊。最後的佇列反過來就是答案。

原理:最後的佇列是返回路徑,所以反過來就是答案。證明?我不會啊!

#include

#include

#include

using

namespace

std;

const

int maxn=100000,maxm=400000;

int tp,n,m,fa[maxm+5],ans[maxm+5],f[maxn+5],g[maxn+5];

int e,lnk[maxn+5],son[maxm+5],nxt[maxm+5],w[maxm+5];bool vis[maxn+5];

#define eoln(x) ((x)==10||(x)==13||(x)==eof)

inline

char readc()

inline

int readi(int &x)

if (lst=='-') f=-f;

while (isdigit(ch)) tot=(tot<<3)+(tot<<1)+ch-48,ch=readc();

return x=tot*f,eoln(ch);

}#define add(x,y,z) son[e]=(y),w[e]=(z),fa[e]=e,nxt[e]=lnk[x],lnk[x]=e++,f[y]++,g[x]++

#define del(j) fa[j]=getfa(nxt[j])

int getfa(int x)

void dfs(int x)

}int main()

if (tp==1)

else

for (int i=1;i<=n;i++) if (f[i]!=g[i]) return

puts("no"),0;

dfs(son[0]);for (int i=1;i<=n;i++) if ((f[i]||g[i])&&!vis[i]) return

puts("no"),0;

puts("yes");while (ans[0]) printf("%d ",ans[ans[0]--]);

return0;}

\

uoj 117 尤拉迴路

1.判斷是否為尤拉存在尤拉迴路 裸的判斷 尤拉迴路就是看一筆能不能把途中所有的邊跑完沒得重複 對於無向邊 建立雙向邊判斷每個點的入度是否為2的倍數 1.1 對於有向邊 建立單向邊判斷每個點的入度與出度是否相等 1.2 然後就是看一下是否所有的點是否連線 可以用並查集或者dfs判斷,具體看情況來定。2...

UOJ 117 尤拉迴路

分析 直接dfs一遍,複雜度o n m 注意類似dinic的當前弧優化,雙向邊標記兩條。sigongzi和mrclr的部落格,關於尤拉迴路以及此題文章。有關尤拉路的總結。1 2 author mjt 3 date 2018 10 16 17 34 46 4 last modified by mjt ...

UOJ 117 尤拉迴路

在圖中找乙個環使得每條邊都在環上出現恰好一次。要注意的地方好多啊 每條邊恰好出現一次!條件 每個點偶度 入度 出度 方法就是套圈法啦 然後本題自環是合法的,如果20000個 1,1 邊的話會被卡成 o n 2 所以加上當前弧優化 include include include include inc...