歐拉回路,歐拉路

 

http://www.cnblogs.com/pandy/archive/2009/05/07/1452209.html

 

參考以上:

 

判斷歐拉路,歐拉回路:

注意圖聯通,可以DFS或者並查集

一.無向圖

歐拉回路:每個頂點度數都是偶數

歐拉路:所有點度數爲偶數,或者只有2個點度數爲奇數

二.有向圖(非混合)

歐拉回路:每個頂點入度等於出度

歐拉路:每個頂點入度等於出度;

或者只有1個點入度比出度小1, 從這點出發,只有1個點出度比入度小1,從這個點結束,其他點入度等於出度

三.混合圖(有的邊單向,有的邊不確定方向)

 

歐拉回路:  

 

判斷一個圖中是否存在歐拉回路(每條邊恰好只走一次,並能回到出發點的路徑),在以下三種情況中有三種不同的算法:

一、無向圖
每個頂點的度數都是偶數,則存在歐拉回路。

二、有向圖(所有邊都是單向的)
每個節頂點的入度都等於出度,則存在歐拉回路。

 

 

歐拉路:

首先判斷底圖是否聯通;

然後,給不定向邊 隨便給定方向,考慮每個點的出度和入度:

1)如果入度和出度之差 都是偶數,說明如果存在歐拉路,則一定是歐拉回路,解法同上;

2)如果可以找到一個且僅一個點st,入度比出度 小奇數,一個出度比入度小奇數的點ed,則加無向邊(st,ed), 轉爲混合圖歐拉回路問題

 

另外,一般關於歐拉路的題,邊數都比較少,如果要求字典序最小,則可以直接存邊,排序後,每次dfs,先走小的,這樣記錄結束順序,倒敘輸出,就是字典序最小的。因爲倒敘輸出,先遍歷到的點會先輸出。

混合圖歐拉回路  相關題目:pku1637,zju1992,hdu3472
  混合圖歐拉回路用的是網絡流。
  把該圖的無向邊隨便定向,計算每個點的入度和出度。如果有某個點出入度之差爲奇數,那麼肯定不存在歐拉回路。因爲歐拉回路要求每點入度 = 出度,也就是總度數爲偶數,存在奇數度點必不能有歐拉回路。
  好了,現在每個點入度和出度之差均爲偶數。那麼將這個偶數除以2,得x。也就是說,對於每一個點,只要將x條邊改變方向(入>出就是變入,出>入就是變出),就能保證出 = 入。如果每個點都是出 = 入,那麼很明顯,該圖就存在歐拉回路。
  現在的問題就變成了:我該改變哪些邊,可以讓每個點出 = 入?構造網絡流模型。首先,有向邊是不能改變方向的,要之無用,刪。一開始不是把無向邊定向了嗎?定的是什麼向,就把網絡構建成什麼樣,邊長容量上限1。另新建s和t。對於入 > 出的點u,連接邊(u, t)、容量爲x,對於出 > 入的點v,連接邊(s, v),容量爲x(注意對不同的點x不同)。之後,察看是否有滿流的分配。有就是能有歐拉回路,沒有就是沒有。歐拉回路是哪個?查看流值分配,將所有流量非 0(上限是1,流值不是0就是1)的邊反向,就能得到每點入度 = 出度的歐拉圖。
  由於是滿流,所以每個入 > 出的點,都有x條邊進來,將這些進來的邊反向,OK,入 = 出了。對於出 > 入的點亦然。那麼,沒和s、t連接的點怎麼辦?和s連接的條件是出 > 入,和t連接的條件是入 > 出,那麼這個既沒和s也沒和t連接的點,自然早在開始就已經滿足入 = 出了。那麼在網絡流過程中,這些點屬於“中間點”。我們知道中間點流量不允許有累積的,這樣,進去多少就出來多少,反向之後,自然仍保持平衡。
  所以,就這樣,混合圖歐拉回路問題,解了。

 

 

 

 

HDU 3018 Ant Trip

          一筆畫問題,無向圖歐拉路或者歐拉回路,注意題目說了,如果是孤立點,則不用考慮。

   對於每個連通塊,如果全都是偶數度,則需要1筆;如果不是,則需要奇數度頂點個數的1/2筆。   我用並查集寫的。

 

 

POJ 1041 John's trip

   

       題目給了一個圖,街道編號1..n(n<1995), 點編號1..m(m<44),求歐拉回路

且字典序最小

     關於字典序最小,每次dfs,先走最小的,這樣倒敘輸出時 先dfs到的先輸出

比較好的是實現是 直接按編號存邊,dfs 記錄結束序,倒敘輸出

fill() [1,m] 忘加1了,WA了幾次

 

 

POJ 1386 Play on Words

   貌似很經典的模型了,應該叫 單詞接龍吧。

   本題要求判斷是否有 有向圖歐拉路

 

 

POJ 2230 Watch Cow

    題目描述每條路必須走兩次,且方向不同,其實一樣了,有向圖的歐拉回路

不過需要輸出的是路徑中的節點。

 

void dfs(int u) {
  int i;
  for (i = head[u]; i != -1; i = edge[i].pre) {
    if (!edge[i].flg)  {
         edge[i].flg = 1;
         dfs(edge[i].v);
         printf ("%d\n", edge[i].v);
       }
     }
   }

 

 

 

 

POJ 2513 Colored Sticks

   比較簡單,判定是否存在 無向圖歐拉路

 

 

POJ 2337 Catenyms

   還是單詞 首尾相連,要求判斷,然後輸出字典序最小的

   有向圖歐拉路,字典序最小,把單詞按照字典序排序,優先dfs小的,記錄結束序,倒敘輸出即可。

沒寫break,查了好久

 

 

POJ 1392 Ouroboros Snake

http://blog.csdn.net/yueashuxia/archive/2010/07/12/5729878.aspx

 

   這裏涉及到DeBruijin圖,即當k=3 時,我們構造一個0,1構成的環,長度爲 2^k,其中,任意的連續的長度爲k個的,會組成0,2^k-1的所有的數字剛好一次,而且要求換的字典序最小。   這裏關鍵就是建圖了,取k-1長度的串,一共有2^(k-1)個作爲點,如果我們把這個串左移,末尾加1或0,可以得到新的節點,則連有向邊,共有2^k條邊,求歐拉回路,字典序最小即可。

    本題要求 按順序輸出 組成的數字。

HDU 2894 DeBruijin

     同上,這次要輸出串

 

郵遞員問題   poj2040 poj2404
哈密頓迴路   poj2439 poj2288 poj1392 hdu2894

hdu
3018
1116
2894
1956
3472

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章