【Learning】 歐拉回路的求解
歐拉回路:
歐拉回路,俗稱一筆畫,比如一筆畫五角星等。
這裏給出非嚴謹的定義:歐拉回路即從一個點出發,不重復、不遺漏地經過所有的邊與所有的點,並恰好回到出發點。
包含歐拉回路的圖稱為歐拉圖。
歐拉回路在有向圖、無向圖和混合圖(存在有向邊和無向邊)上有不同的求法,不過原理上是類似的。
判斷方法:
有向圖:
研究歐拉回路的性質我們發現:在有向圖的歐拉回路中,每一個點,一定是若幹次一進一出,否則無解。
因此要求每一個點的入度=出度。
無向圖:
類似有向圖,在無向圖的歐拉回路中,每一個點也是若幹次一進一出。
因此要求每一個點的度數為偶數。
混合圖:
這下就不好考慮了,我們需要使用網絡流建模。我們想辦法從出度和入度入手。
首先看每一條有向邊$(u,v)$,它們一定會為$u$提供1的出度,為$v$提供$1$的入度。
其次看每一條無向邊$(u,v)$,由於其無向,我們暫且隨便定一個方向(幹脆就$u$->$v$好了),為$u$提供1的出度,為$v$提供1的入度。
現在每個點的出度和入度看起來是亂七八糟的了。我們期望的,是一個點的出度與入度平衡。
由於有向邊已經固定,沒法改變它們對出入度的貢獻,那麽現在要做的,是將某一些無向邊反向,使得所有點的出入度平衡。
一條邊一反向,就會將某一度$-1$,將另一度$+1$。由此如果一個點出入度之差為奇數,那麽一定不可能通過無向邊的調整使它平衡,此時一定無解。
設一個點$u$的出度為$out$,入度為$in$。
如果$out>in$,那麽從這個點出發的邊太多。它提供$x=\frac{1}{2}(out-in)$條出邊可以反向。這樣會給每一條出邊的終點的$out+1$,$in-1$。那麽由源點$S$向$u$連一條容量為$x$的邊。
如果$in>out$,那麽到達這個點的邊太多。它提供$x=\frac{1}{2}(in-out)$條邊可以反向。這樣會給每一條入邊的起點的$out-1$,$in+1$。那麽由$u$向匯點$T$連一條容量為$x$的邊。
基於上述關系,$out>in$的點集可以給$in>out$的點集提供邊,使得雙方都盡可能平衡,即多的給少的。
那麽對於原圖中每一條無向邊$(u,v)$,剛剛定的方向是$u$->$v$才得出當前的度數,那麽由$u$向$v$連一條容量為$1$的邊就好。
跑最大流,看由$S$出發的邊是否全部滿流:如果是,則存在歐拉回路;否則不存在歐拉回路。因為這些邊滿流,代表$out>in$的點已經平衡,可以發現$in>out$的邊也恰好平衡了。
如何輸出歐拉回路?根據上述建模方法,如果存在歐拉回路,對於中間的點互連的容量為$1$的邊,如果流量為0該無向邊就這麽定向,如果流量為1,所對應的無向邊應該要反向。有向邊直接輸出即可。
【Learning】 歐拉回路的求解