1. 程式人生 > >最大流最小割演算法&證明

最大流最小割演算法&證明

該文章僅供參考-_-

定義:

假設N=(V,E)是一個有向圖,其中結點s和t分別是N的源點和匯點。邊(u,v)的容量c(u,v)定義為:能夠通過該邊的最大流量。
通過每條邊的流f(u,v)的需要滿足如下約束:
(1)f(u,v) <= c(u,v),即容量約束。
(2)對於任意v不屬於{s,t},有sum{ f(u,v) } = sum{ f(v,u) },即流入某個中間結點的流量等於從這個結點流出的流量。

網路流定義f定義為|f| = sum{ f(s,v) },代表從源點流入匯點的流量。
最大流問題,是求得|f|的最大值。
s-t割定義為對V的一個二劃分,其中s和t屬於不同的兩個集合S和T。割集就是{ (u,v)| u屬於S, v屬於T }。顯然,如果割集中的所有邊被移除,那麼|f| = 0。
割的容量定義為c(S, T) = sum{ c(u,v), 其中u屬於S,v屬於T }。


最小割問題,是求得這樣一個s-t割C(S, T),使得S-T割的容量最小。

最大流最小割定理:一個s-t流的最大值,等於其s-t割的最小容量。

證明(1):

對於某個頂點集合S∈V,從S出發指向S外部的邊的集合,記為割(S, V\S)。如果s∈S,t∈(V\S),那麼此時的割有成為s-t割。如果將割包含的邊都刪去,就不再有從s到t的路徑了。

最小割問題:對於給定網路,為了保證沒有從s到t的路徑,需要刪去的邊的總容量的最小值是多少?
這個問題和最大流問題有很深的聯絡。對於任意的s-t流f和任意的s-t割(S, V\S)。很容易證明:(f的流量) = (S的出邊的總流量-S的入邊的總流量) ≤ (S的出邊的總流量) = (割的容量)。

用Ford-Fulkerson演算法求出了流f,“流完”後的殘餘網路已經不存在s到t的路徑。記從s出發可達的點集合為S,那麼S的出邊一定已經滿流,於是S的入邊一定是空的。於是(f的流量) = (S的出邊的總流量-S的入邊的總流量) = (割的容量)。結合前面的不等式,可知f已經達到最大。

證明(2):
由於具有最大流量的流存在,所以我們可以取一個最大流f.
遞迴的定義一個頂點集S如下,
首先,source在 S中。
其次,若x在S中,且f(xy)<C(xy), 則y也在S中。
最後,若x在S中,且f(yx)>0, 則y也在S中。
反覆使用上述過程,最後可以得到一個由頂點構成的集合,即S.由於圖中只有有限多個頂點,所以上述過程也一定會在有限多個步驟之後終止。還需證明sink不在S中。如下。
假如sink在S中,則有一列頂點,x_1=source, x_2, …, x_n=sink.使得 r_i = \max{c(x_ix_{i+1})-f(x_ix_{i+1}),f(x_{i+1}x_i)}>0
這個式子不大容易看清,我們重新敘述如下,對於該序列中的任意兩個相鄰頂點x,y,其中x=x_i在y=x_{i+1}前面,都有C(xy)-f(xy)>0 或者 f(yx)>0,取二者當中較大的一個,這個數就是r_i.然後取所有r_i中最小的一個,有限多個正數的最小值還是一個正數(嚴格大於0)。記這個正數為r.由此對f作一些修改可以構造一個新的流,若邊xy在上述序列中,則將流量f(xy)修改為f(xy)+r.否則就不作改變。這樣得到的函式確實是一個流,滿足容量限制,而且其流量比f的流量要大r>0.這就和f是最大流矛盾。這就證明了S確實為一個割。
下面說明割S的容量 = 流f的流量。首先有等式, f 的流量 = f(S,V-S) – f(V-S,S).
由S的構造,容易看出第一項 f(S,V-S) = C(S,V-S) = 割S的容量。第二項f(V-S,S) = 0.證畢。
記號V-S表示不在S中的頂點全體,亦即表示集合S在V中的餘集。


最大流最小割的整性定理:若容量C(xy)都是整數,則最大流f的流量f(xy)也都是整數。

實際上,當每條邊的容量都是整數時,max-flow min-cut定理的證明也給出了一個很好的演算法。如下,構造流的序列f_0,f_1, f_2, … 使得對每一條邊,其流量都是遞增的。
流f_0, 對每條邊賦予流量f_0(xy)=0. 這是一個平凡的流。對於流f_i, 如max-flowmin-cut定理的證明,構造相應的集合S.則有兩種情形。若sink在S中,如此,我們將終止這個構造過程。另一種情形是sink不在S中,這樣可找到一條由source到sink的鏈,亦即一些首尾依次相連的邊,這些邊連線著source和sink,將這條邊的每一個的流量增加1, 這樣得到一個新的流f_{i+1}.這個程式將在有限多個步驟之後終止,最後所得即為一個在每條邊上的流量都是整數的流。

最大流最小割的對偶定理

前面,我們對於流量進行的限制是要求每一條邊的流量有一個上限,即容量C(xy).我們也可以對每一個頂點的容量進行限制,即要求流入每一個頂點的流量有一個上限。注意到對每一個頂點,我們對於流入和流出進行了區分的,在一個不是source或sink的頂點,流入的流量等於流出的流量。因而二者都是有限的。對於這樣的圖,我們可以類似的定義割、割得容量這兩個概念。此時的割稱為Vertex-cut, 定義為V-{source,sink}的一個子集S使得,在V-S不可能存在一個具有正流量的流。
通常我們不限制source和sink的流量,或者說,這兩個頂點的容量是無窮大。
對頂點限制流量的定向圖,可以用一個小的技巧轉化為我們已經證明過的對邊的容量進行限制的定向圖。於是我們有下述的定理。
定理:設定向圖(V,E)的頂點有容量限制,但在source和sink處沒有容量限制,則關於頂點的最小割的容量 =最大流的流量。
Source 和sink多於1個的情形。
設s_1, s_2, … ,s_n為全部的source, 我們將之轉化為只有一個sourece的情形。在原來的定向圖中新增一個頂點s,以及定向邊ss_i, 在這些邊上的容量限制取作無窮大。由此即可轉換為只有一個source的情形。
對於sink完全類似的處理即可。
注意到,max-flowmin-cut定理中,如果某些邊的容量為無窮大,定理的結論仍然成立,只不過此時的最大流的流量可能是無窮大。證明的方法也沒有多大變化,無非就是稍稍改變一下其中的某些敘述。