演算法思想:
判斷乙個圖中是否存在尤拉迴路(每條邊恰好只走一次,並能回到出發點的路徑),在以下三種情況中有三種不同的演算法:
一、無向圖
每個頂點的度數都是偶數,則存在尤拉迴路。
二、有向圖(所有邊都是單向的)
每個節頂點的入度都等於出度,則存在尤拉迴路。
以上兩種情況都很好理解。其原理就是每個頂點都要能進去多少次就能出來多少次。
三、混合圖(有的邊是單向的,有的邊是無向的。常被用於比喻城市裡的交通網路,有的路是單行道,有的路是雙行道。)
找到乙個給每條無向的邊定向的策略,使得每個頂點的入度等於出度,這樣就能轉換成上面第二種情況。這就可以轉化成乙個二部圖最大匹配問題。網路模型如下:
1. 新建乙個圖。
2. 對於原圖中每一條無向邊i,在新圖中建乙個頂點e(i);
3. 對於原圖中每乙個頂點j,在新圖中建乙個頂點v(j)。
4. 如果在原圖中,頂點j和k之間有一條無向邊i,那麼在新圖中從e(i)出發,新增兩條邊,分別連向v(j)和v(k),容量都是1。
5. 在新圖中,從源點向所有e(i)都連一條容量為1的邊。
6. 對於原圖中每乙個頂點j,它原本都有乙個入度in、出度out和無向度un。顯然我們的目的是要把所有無向度都變成入度或出度,從而使它的入度等於總度數的一半,也就是(in + out + un) / 2(顯然與此同時出度也是總度數的一半,如果總度數是偶數的話)。當然,如果in已經大於總度數的一半,或者總度數是奇數,那麼尤拉迴路肯定不存大。如果in小於總度數的一半,並且總度數是偶數,那麼我們在新圖中從v(j)到匯點連一條邊,容量就是(in + out + un) / 2 – in,也就是原圖中頂點j還需要多少入度。
按照這個網路模型算出乙個最大流,如果每條從v(j)到匯點的邊都達到滿流量的話,那麼尤拉迴路成立。
尤拉迴路一定要聯通的
**:#include#include#define maxn 1005
#define max 999999
int a[maxn];
bool visited[maxn];
bool edge[maxn][maxn];
int n,m;
void dfs(int k){
visited[k]=true;
int i;
for(i=0;i
HDU1878 尤拉迴路
problem description 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出...
HDU 1878 尤拉迴路
題意 尤拉迴路的判斷條件,一 無向圖 每個頂點的度數都是偶數,則存在尤拉迴路。二 有向圖 所有邊都是單向的 每個節頂點的入度都等於出度,則存在尤拉迴路。以上兩種情況都很好理解。其原理就是每個頂點都要能進去多少次就能出來多少次。三 混合圖 有的邊是單向的,有的邊是無向的。常被用於比喻城市裡的交通網路,...
HDU 1878 尤拉迴路
題目描述 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?輸入描述 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出一對正整數,分別是該條邊直接連通...