1. 程式人生 > >混合圖的歐拉回路一般求解方法

混合圖的歐拉回路一般求解方法

預備知識

1、歐拉回路是圖G中的一個迴路,經過每條邊有且僅一次,稱該回路為歐拉回路。具有歐拉回路的圖稱為尤拉圖,簡稱E圖。

  2、 無向圖中存在歐拉回路的條件:每個點的度數均為偶數。

  3、有向圖中存在歐拉回路的條件:每個點的入度 = 出度。

  4、尤拉路徑比歐拉回路要求少一點:無向圖中存在尤拉路徑的條件:每個點的度數均為偶數或者有且僅有2個度數為奇數的點。

  5、有向圖中存在尤拉路徑的條件:除了2個點外,其餘的點入度=出度,且在這2個點中,一個點的入度比出度大1,另一個出度比入度大1。

  6、尤拉路徑的輸出:經典的套圈演算法。

求解一般圖歐拉回路的基本演算法

對於歐拉回路,有一個基本的演算法:對於無向圖,每個點的度都是偶數,則圖中有歐拉回路存在;對於有向圖,只要每個點的出度等於入度,則圖中有歐拉回路存在。

求解混合圖歐拉回路的一般方法

1、隨意定向

在混合圖中,對於雙向邊的處理除了拆邊之外,還有任意定向。先對全圖的雙向邊進行任意定向,接著使用上文的歐拉回路演算法,很顯然,無法得到結果。但是通過這一步,至少可以確定這樣一件事實,如果一個點的出度加入度一定是奇數的話,那麼這個圖一定沒有歐拉回路。

隨意定向是沒有依據的,但是可以使用這樣的隨機化處理方法,再使用恰當的調整方法構造出解。

2、自調整方法

所謂的自調整方法就是將其中的一些邊的方向調整回來,使所有的點的出度等於入度。但是有一條邊的方向改變後,可能會改變一個點的出度的同時改變另一個點的入度,相當於一條邊制約著兩個點。同時有些點的出度大於入度,迫切希望它的某些點出邊轉向;而有些點的入度大於出度,迫切希望它的某些入邊轉向。這兩條邊雖然需求不同,但是他們之間往往一條邊轉向就能同時滿足二者。

具體步驟:

1、另x = |入度-出度|/2;對於不同的點有不同的x值,這個x值代表它們在鄰接表中相應調整x條就能讓出度等於入度。

2、以把圖中的點轉換為一個二分圖,每個點的x值就是它們的點權。

3、置源點S向所有出度>入度的點連邊;設定匯點T,所有入度大於出度的點連邊,將各自的點權轉換為邊權。

4、最後將原圖中所有暫時定向的無向邊加上一個1的容量,方向不變,而有向邊不能改變方向,不需連邊。

可以發現,從源點S出發的一個單位流將會一個“無向邊”的容量變為0,使得兩端的點權各自減1,其實這就是在模擬一次對無向邊方向的調整。當把圖建好後,依靠最大流性質可以最大可能地無衝突調整邊的方向,並最終使得每個點的點容量都達到滿流。

最後,還要對那些圖中出度等於入度的點做適當分析,它們作為一個“中間點”,由於流平衡性質,不會留下任何流量值,對於那些真正需要調整的點不會帶來任何影響。

最後,如何得到答案?那就是檢查從源點出發的每條邊是否都滿流,如果有一條邊沒有滿流,說明有一個點沒有調整到入度等於出度,於是整個圖不存在歐拉回路。

具體的題目有: POJ 1637、 Hdu 3472

附POJ 1637 程式碼:

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <string>
  6. usingnamespace std;  
  7. constint MAXN = 1010;  
  8. constint MAXM = 50010;  
  9. constint INF = 0x3f3f3f3f;  
  10. struct Edge  
  11. {  
  12.     int v, f;  
  13.     int next;  
  14. }edge[MAXM];  
  15. int n, m;  
  16. int cnt;  
  17. int s, t;  
  18. int first[MAXN], level[MAXN];  
  19. int q[MAXN];  
  20. int ind[MAXN], outd[MAXN];  
  21. int totFlow;  
  22. void init()  
  23. {  
  24.     cnt = 0;  
  25.     totFlow = 0;  
  26.     memset(first, -1, sizeof(first));  
  27.     memset(ind, 0, sizeof(ind));  
  28.     memset(outd, 0, sizeof(outd));  
  29. }  
  30. void read(int u, int v, int f)  
  31. {  
  32.     edge[cnt].v = v, edge[cnt].f = f;  
  33.     edge[cnt].next = first[u], first[u] = cnt++;  
  34. }  
  35. void read_graph(int u, int v, int f)  
  36. {  
  37.     read(u, v, f);  
  38.     read(v, u, 0);  
  39. }  
  40. 相關推薦

    混合一般求解方法

    預備知識 1、歐拉回路是圖G中的一個迴路,經過每條邊有且僅一次,稱該回路為歐拉回路。具有歐拉回路的圖稱為尤拉圖,簡稱E圖。   2、 無向圖中存在歐拉回路的條件:每個點的度數均為偶數。   3、有向圖中存在歐拉回路的條件:每個點的入度 = 出度。   4、尤拉路徑比歐拉回路要求少一點:無向圖中

    混合

    所有 ace .cn geo urn 我們 方向 online n) http://acm.pku.edu.cn/JudgeOnline/problem?id=1273 給一組邊 有的是有向邊有的是無向邊 問是否存在歐拉回路 我們知道如果每個點入度等於出度 就存在歐拉回路

    [POJ1637]Sightseeing tour:混合

    分析 混合圖歐拉回路問題。 一個有向圖有歐拉回路當且僅當圖連通並且對於每個點,入度\(=\)出度。 入度和出度相等可以聯想到(我也不知道是怎麼聯想到的)網路流除了源匯點均滿足入流\(=\)出流。於是可以考慮先將無向邊隨意定向後,通過網路流來調整無向邊的方向以達到每個點的入度和出度相等的目的。 建圖方法

    [BZOJ2095]-[Poi2010]Bridges-二分答案+混合判定

    說在前面 寫這道題順便學了學混合圖歐拉回路判定,感覺自己萌萌噠! 話說me網路流連反向邊都忘記建了,居然還可以過樣例??? 一直以來都十分佩服樣例資料,以及造資料的人,無論程式有什麼bug都能跑對… 題目 題面 (直接概括題目大意就沒什麼意思

    【Learning】 求解

    blog class 反向 16px body 中間 所有 歐拉圖 log 歐拉回路:   歐拉回路,俗稱一筆畫,比如一筆畫五角星等。   這裏給出非嚴謹的定義:歐拉回路即從一個點出發,不重復、不遺漏地經過所有的邊與所有的點,並恰好回到出發點。   包含歐拉回路的圖稱

    【BZOJ3659】Which Dreamed It【有向計數】【matrix tree定理】【BEST定理】【高斯消元】

    定理題... /* Think Thank Thunk */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typede

    ccf 201512-4 送貨 無向

    Problem: n個節點m條路,看成一個無向圖,判斷能否每條路直走一次。 Solution: 先判斷度,只能是1個或2個奇數度。 然後判斷邊的數目是否等於m,否則是非連通圖。 然後按字典序

    有向

    Watchcow Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5902 Accepted: 2538 Special Judge Description Bessie's been ap

    LOJ-10106(有向的判斷)

    鏈接 sin img n) blog problem space 分享圖片 ems 題目鏈接:傳送門 思路: (1)將每個單詞視為有向路徑,單詞的起始字母是起始節點,末尾字母是終止節點,然後找由字母建立的有向圖 是否是歐拉圖或者半歐拉圖。 (2)先用並查集判斷是否連通,再判

    混合求解方法(轉)

    基礎知識 歐拉回路是圖G中的一個迴路,經過每條邊有且僅一次,稱該回路為歐拉回路。具有歐拉回路的圖稱為尤拉圖,簡稱E圖。 無向圖中存在歐拉回路的條件:每個點的度數均為偶數。 有向圖中存在歐拉回路的條件:每個點的入度=出度。 尤拉路徑比歐拉回路要求少

    算法復習——混合(bzoj2095二分+網絡流)

    n) truct lin 歐拉圖 所有 mage borde algo stream 題目: Description YYD為了減肥,他來到了瘦海,這是一個巨大的海,海中有n個小島,小島之間有m座橋連接,兩個小島之間不會有兩座橋,並且從一個小島可以到另外任意一個小島。現在

    HDU3472,混合

    題目連結:HS BDC 建圖方法:將一個單詞的首位字母視作一個點。對於反轉後還成立的單詞在最大流的圖中建立首到尾的邊,反轉後不成立的單詞則不用建邊。之後再用普通的求法就行。注意連通性的判斷。 詳見程式碼: /***************************

    混合

    歐拉回路 從一個點開始把圖中的邊恰好經過一次,再回到出發點,這樣的路徑就是歐拉回路。 如圖就是一個歐拉回路 歐拉回路判定 不過怎麼樣的圖中才存在歐拉回路呢? 歐拉回路分有向圖和無向圖兩種: 有向圖:

    判斷混合(既有有向邊又有無向邊)存在方法

      假設有一張圖有向圖G',在不論方向的情況下它與G同構。並且G'包含了G的所有有向邊。那麼如果存在一個圖G'使得G'存在歐拉回路,那麼G就存在歐拉回路。   其思路就將混合圖轉換成有向圖判斷。實現的時候,我們使用網路流的模型。現任意構造一個G'。用Ii表示第i個點的入度,Oi表示第i個點的出度。如果存在一

    POJ1637:Sightseeing tour(混合)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10581   Acc

    Poj 1637 Sightseeing tour (混合判定)

    題意:給出一個混合圖,要求判定歐拉回路是否存在,輸入 x y d,如果d為0則為無向邊,為1則為有向邊。 首先應該判定圖的連通性!本題所給圖均是連通的,所以沒有判斷。 對所有的無向邊隨便定向,之後再進行調整。 統計每個點的出入度,如果有某個點出入度之差為奇數,則不存在歐

    poj 1637 判斷混合是否存在

    題意: 就是對有無向邊和有向邊的混合圖,判斷存不存在歐拉回路。  若圖G中存在這樣一條路徑,使得它恰通過G中每條邊一次,則稱該路徑為尤拉路徑。若該路徑是一個圈,則稱為尤拉(Euler)迴路。 參考下面的解釋: 【混合圖】 混合圖(既有有向邊又有無向邊的圖)中尤拉環、尤拉路

    The Necklace UVA - 10054 (無向

    n) 兩個 logs nec get dfs lap none view The Necklace UVA - 10054 題意:每個珠子有兩個顏色,給n個珠子,問能不能連成一個項鏈,使得項鏈相鄰的珠子顏色相同。 把顏色看做點,珠子內部連一條邊,無向圖求歐拉回路。 這

    poj1386有向判斷是否存在或者

    第一個 include 構圖 cannot tdi ear 首字母 字符 else 有向圖的圖聯通是指基圖聯通,也就是把有向圖的邊改成無向圖然後看是否連通。判斷聯通可用dfs或者並查集。 題意就是給你n個由小寫字母構成的字符串,問你能不能將這n個字符

    計蒜客 | | 判斷

    conn mar map sca thml gin def 是否 bool 你學過一筆畫問題麽?其實一筆畫問題又叫歐拉回路,是指在畫的過程中,筆不離開紙,且圖中每條邊僅畫一次,而且可以回到起點的一條回路。 蒜頭君打算考考你,給你一個圖,問是否存在歐拉回路? 輸入格式 第