uoj 117 尤拉迴路 套圈法

2021-08-19 01:53:27 字數 1005 閱讀 2924

給出一幅有向或無向圖,判斷是否存在乙個環走遍所有邊,若有則輸出求其中的環.

首先判斷很容易,對於無向圖只要聯通且度數都是偶數即可,對於有向圖,則要聯通且入度等於出度,問題在於如何找到這個環.

我們可以發現,如果隨便走的話,必然會回到出發點,但是不一定走過所有的邊,而剩下的圖恰是一條與我們之前走的路有交點的尤拉迴路,沒有走完的原因就是我們之前有些地方走錯了,因此要退回到兩條路的焦點,也就是還有邊沒有走過的點,然後走完剩餘圖中的尤拉迴路,再走之前倒退的路即可,用dfs不斷反覆上述過程即可.

這裡要注意乙個優化,乙個點已經走過的邊不重複遍歷(否則最劣會退化為o(m^2)),也就是修改每個點的第一條邊(詳見**).

#include

#include

#include

#define gg return void(puts("no"));

#define n 100100

using

namespace

std;

int t,n,m,bb=1,first[n],cnt,ans[n<<1],ds[n];

struct bn

bn[n<<2];

inline

void add(int u,int v)

namespace solve1

}void work()

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

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

}if(cnt!=m) gg;

puts("yes");

for(i=cnt;i>=1;i--)

}}namespace solve2

}void work()

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

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

}if(cnt!=m) gg;

puts("yes");

for(i=cnt;i>=1;i--)

}}int main()

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