首先說說概念:
設g是無向連通圖, 則稱經過g的每條邊一次且僅一次的路徑為尤拉通路.
如果尤拉通路是迴路, 那麼該迴路為尤拉迴路.
具有尤拉迴路的無向圖g稱為尤拉圖.
如果g是有向圖, 並且g的基圖聯通. 那麼由上面的定義中所有的名次加上乙個有向即可…
相關定理:
1: 無向圖g存在尤拉通路的充要條件是: g為連通圖, 並且g僅有兩個奇度節點或者無奇度節點
2: 當g有兩個奇度節點的連通圖時, g的尤拉桐廬必以次兩個節點為端點.
3: g為尤拉圖(g存在尤拉迴路)的充要條件是g為無奇度節點的連通圖.
4: 有向圖d存在尤拉通路的充要條件是: d為有向圖, d的基圖連通, 並且所有頂點的出度和入度相等; 或者除兩個點外, 其餘頂點的出度和入度都相等, 而這兩個頂點中乙個頂點出入度之差為1, 另乙個為-1.
5: 若有這兩個點, 那麼一定是以出入度之差為1作為起點, 另乙個作為終點.
6: d為有向尤拉圖(d存在有向尤拉迴路)的充要條件是d的基圖連通, 並且所有的頂點出入度都相等.
用以上定理可以解決一些直接判定問題. 而這些問題的關鍵在於如何把問題轉化為圖的模型. 這些多做題就自然有這種感覺.
那麼還有一類問題, 就是如何輸出尤拉路徑了. 普遍的方法有兩種, 一是dfs爆搜每一條邊, 走不通就不走, 直到搜出正解. 還有一種是叫弗洛萊演算法. 它的思想是, 從出發點出發開始尋找可以擴充套件的邊, 並且對於當前的情況, 優先找不是 橋 的邊. 然後遞迴輸出, 即可. 模板如下: 因為涉及到了刪邊的處理, 那麼用臨接矩陣存圖.
模板題
fleury演算法板子(只是對於圖中有點,邊無資訊的):
/**@cain*/
const
int maxn = 1e3+5;
int cas=1;
int du[maxn],path[maxn];
int n,m,top=0;
void dfs(int u)
}path[top++] = u;
}void solve()
int flag = 1;
for(int i=1;i<=n;i++)
}if(flag) dfs(1); //尤拉迴路的情況.
for(int i=0;i"%d%c",path[i],i==top-1?'\n':' ');
}}
一般標記邊的可以用鏈式前向星做, 一般對於邊上有資訊的, 點不重要的…..
隨機應變…(板子在另外的部落格裡面)
暫時就姜這麼多了…..
尤拉路徑 尤拉迴路
尤拉迴路 連通圖,一條路徑恰好經過所有邊一次,並且構成迴路 起點終點相同 尤拉路徑 連通圖,一條路徑恰好經過所有邊一次 起點終點不必相同 具有尤拉迴路的圖稱尤拉圖,具有尤拉路徑但不具有尤拉迴路的圖稱半尤拉圖 無向圖尤拉迴路的判斷 連通圖,所有頂點度數均為偶數 無向圖尤拉路徑的判斷 連通圖,只有兩頂點...
尤拉迴路 尤拉路徑
尤拉路徑 如果圖 g 種的一條路徑包括所有的邊,且僅通過一次的路徑.尤拉迴路 能回到起點的尤拉路徑.混合圖 既有無向邊又有無向邊的圖.hierholzer演算法自動尋找尤拉迴路,在找不到尤拉迴路的情況下會找到尤拉路徑。前提是得給它指定好起點。演算法流程 無向圖 1.判斷奇點數。奇點數若為0則任意指定...
尤拉路徑和尤拉迴路的路徑
尤拉路徑和尤拉迴路 尤拉路徑 從某結點出發一筆畫成所經過的路線叫做尤拉路徑。尤拉迴路 在尤拉路徑的基礎上又回到起點。a 凡是由偶點組成的連通圖,一定可以一筆畫成。畫時可以把任一偶點為起點,最後一定能以這個點為 終點畫完此圖。b 凡是只有兩個奇點的連通圖 其餘都為偶點 一定可以一筆畫成。畫時必須把乙個...