1. 程式人生 > >尤拉圖【迴路】和半尤拉圖【通路】//很棒的一篇總結

尤拉圖【迴路】和半尤拉圖【通路】//很棒的一篇總結

尤拉路的基本題。只要知道就可以做出來了。

定義:
歐拉回路:每條邊恰好只走一次,並能回到出發點的路徑
尤拉路徑:經過每一條邊一次,但是不要求回到起始點

首先看歐拉回路的存在性的判定:【所有頂點】

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

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

 (三)混合圖歐拉回路
  混合圖歐拉回路用的是網路流。
  把該圖的無向邊隨便定向,計算每個點的入度和出度。如果有某個點出入度之差為奇數,那麼肯定不存在歐拉回路。因為歐拉回路要求每點入度 = 出度,也就是總度數為偶數,存在奇數度點必不能有歐拉回路。
  好了,現在每個點入度和出度之差均為偶數。那麼將這個偶數除以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連線的點,自然早在開始就已經滿足入 = 出了。那麼在網路流過程中,這些點屬於“中間點”。我們知道中間點流量不允許有累積的,這樣,進去多少就出來多少,反向之後,自然仍保持平衡。
  所以,就這樣,混合圖歐拉回路問題,解了。


尤拉路徑的存在性判定:【所有頂點 + 注意兩個端點】

(一)無向圖
一個無向圖存在尤拉路徑,當且僅當   該圖所有頂點的度數為偶數   或者  除了兩個度數為奇數外其餘的全是偶數

(二)有向圖
一個有向圖存在尤拉路徑,當且僅當 該圖所有頂點的度數為零     或者 一個頂點的度數為1,另一個度數為-1,其他頂點的度數為0

(三)混合圖尤拉路徑
其實整篇文章只有這部分是我寫的哈,灰常不好意思,只是網上的同志們寫的太好了,實在沒有必要重複勞動,不知道大家有沒有發現,求尤拉路徑的第一步一定是求歐拉回路,在混合圖上也不例外,如何判斷混合圖歐拉回路問題的存在性呢?首先,我們用上文所說的方法判斷該圖是否存在歐拉回路,如果存在,尤拉路徑一定存在。如果歐拉回路不存在,那麼我們列舉尤拉路徑的起點和終點,連線一條無向邊,然後再用最大流判斷是否存在歐拉回路即可。