學習筆記 尤拉迴路

2022-04-07 10:22:38 字數 2098 閱讀 8819

設 \(g(v,e)\) 是一張圖

尤拉迴路: 圖 \(g\) 中經過每條邊一次並且僅一次的迴路.

尤拉路徑: 圖 \(g\) 中經過每條邊一次並且僅一次的路徑.

尤拉圖: 存在尤拉迴路的圖.

半尤拉圖: 存在尤拉路徑但不存在尤拉迴路的圖.

以下的圖中, 預設把孤立點刪除, 因為這樣不會影響原圖是否為尤拉圖.

定理1: 無向圖 \(g\) 為尤拉圖, 當且僅當 \(g\) 為連通圖且所有頂點的的度為偶數.

推論1: 無向圖 \(g\) 為半尤拉圖, 當且僅當 \(g\) 為連通圖, 且除了兩個頂點的度為奇數外, 其他頂點的度為偶數.

定理2: 有向圖 \(g\) 為尤拉圖, 當且僅當 \(g\) 為連通圖且所有頂點的入度等於出度.

推論2: 有線圖 \(g\) 為半尤拉圖, 當且僅當 \(g\) 為連通圖, 且存在頂點 \(u\) 的出度比入度大 \(1\), 頂點 \(v\) 的入讀比出度大 \(1\), 其他頂點的入度等於出度.

性質1: 設 \(c\) 是尤拉圖 \(g\) 的乙個簡單迴路, 將 \(c\) 中的邊從圖 \(g\) 中刪去得到乙個新圖 \(g'\), 則 \(g'\) 的每乙個極大連通子圖都存在一條尤拉迴路.

性質2: 設 \(c_1,c_2\) 是圖 \(g\) 的兩個沒有公共邊, 但有至少乙個公共點的簡單迴路, 則可以將它們合併成乙個新的簡單迴路 \(c'\).

\(dfs\), 當乙個點的所有邊都被遍歷過後, 將這個點加入答案的棧中, 最後從棧頂開始輸出答案.

其實這個演算法叫做 hierholzer 演算法, 它的想法是每次找出一條迴路, 然後從圖上刪去這個迴路, 再從回路上的每個節點開始去找新的迴路, 找到新的迴路後再把它和原來的迴路合併. 根據上面的 性質1 和 性質2, 可以證明若圖上存在一條尤拉迴路, 這樣一定能夠找出來.

而上述的過程其實就相當於對整張圖 \(dfs\) 一遍, 每次 \(dfs\) 到頂時就相當於找到了一條迴路. 假設這條回路上存在一條邊 \((u,v)\), 那麼沿著 \((u,v')\) 繼續 \(dfs\) 就相當於找一條新的迴路. 乙個點的所有邊都被遍歷過後再把這個點加入棧中, 就相當於合併若干個環.

尤拉迴路

這個板子相對麻煩一點, 因為它要同時處理有向圖和無向圖的情況, 並且要求輸出邊的方案.

#includeusing namespace std;

const int _=1e5+7;

const int __=4e5+7;

int n,m,ty,st,de[_][2];

int lst[_],nxt[__],to[__],id[__],tot=1;

int ans[__],top;

bool ban[__];

int gi()

return x;

}void add(int x,int y,int t,int ty)

}void init()

}void dfs(int u,int t) // 需要及時更新 lst, 否則會被卡到 m^2

ban[i]=1;

if(ty==1) ban[i^1]=1;

lst[u]=nxt[i];

dfs(to[i],t+1);

ans[++top]=id[i]; }}

void run()

else if(ty==2&&de[i][0]!=de[i][1])

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

if(de[i][0])

dfs(st,1);

for(int i=2;i<=tot;i++)

if(!ban[i])

puts("yes");

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

printf("%d ",ans[i]);

putchar('\n');

}int main()

學習筆記 尤拉迴路

有兩個概念 尤拉路徑 在乙個圖中,由i點出發,將每個邊遍歷一次最終到達j點的一條路徑。尤拉迴路 i j時的尤拉路徑。我們需要確定乙個圖是否存在尤拉路徑,並找到這條路徑 那就很好做了qwq 可以用並查集判斷圖的聯通性 然後對於有向圖與無向圖,使用上述性質進行判斷 對於無向圖的尤拉迴路,任意一點都可以作...

尤拉迴路學習筆記

尤拉道路 概念 從無向圖中的乙個結點出發走出一條道路,每條邊恰好經過一次。這樣的路線稱為尤拉道路,也可形象的稱為 一筆畫 性質 除了起點和終點以外,其他點的 進出 次數應該相等。換句話說,除了起點和終點以外,其他點的度數應該是偶數 這也就引出了尤拉道路的充分條件 如果乙個無向圖是連通的,且最多只有兩...

尤拉迴路學習筆記

這裡先說一下尤拉圖和尤拉迴路的概念 如果圖g中的乙個路徑包括每個邊恰好一次,則該路徑稱為尤拉路徑 euler path 如果乙個迴路是尤拉路徑,則稱為尤拉迴路 euler circuit 具有尤拉迴路的圖稱為尤拉圖 簡稱e圖 具有尤拉路徑但不具有尤拉迴路的圖稱為半尤拉圖。這就清楚好多了,然後下面是尤...