本文使用 Zhihu On VSCode 創作併發布

嘗試以通俗語言解釋最大流最小割定理。如有錯誤還請指正。

前置知識

網路

:指具有兩個不同的特定頂點(

發點

x

收點

y

)的加權連通圖,記為

N(D_{xy},w)

。其中

w

容量函式

:圖中某條邊到某個值(容量,或者通俗地說成“最大邊權”)的對映。

對某條邊

a

,其

容量

記為

w(a)

,也就是這條邊的權值最大為

w(a)

容量函式

w

的函式值非負,則稱該網路為

容量網路

:對一個容量網路,如果存在

f\in\mathcal E(D)

滿足:對圖中的任意一條邊有

0\leq f(a)\leq c(a)

,並且對圖中除了發點和收點之外的任意頂點都有

f^+(u)=f^-(u)

,則稱

f

N

中從

x

y

的流。通俗地說,就是我基於原圖構造一個有向的新圖,這個有向新圖滿足:除了發點收點之外的任意點的出邊權值和與入邊權值和相等,並且這個新圖的每條邊權值非負且小於等於原來圖中對的權值。

流量

f^+(x)-f^-(x)

稱為流

f

的流量(發點出邊權值減去入邊權值稱為流量)。

N

中流量最大的流稱為

最大流

截邊集

:對容量網路,把

N

中的點分成兩個集合,並且保證

x

y

不在同一個集合中,且集合中的點相互可達(連通)。如果一條邊的兩個端點屬於不同的集合,則這條邊稱為“截邊”,所有這樣的邊的集合稱為截邊集,記為集合

B

。其實截邊集相當於阻斷

N

中所有

xy

之間的路。

在容量網路中,對於任意的點的劃分,具有最小容量的截邊集稱為

最小截(minimum cut set)

,或者

最小割

最大流最小割定理

在任何容量網路

N

中,最大流量等於最小截容量。

大致的證明思路

首先形象地理解一下:把這個流想象成水流。流量就相當於質量守恆(?)。那我把這些流徹底阻斷(也就是選取一個截邊集),阻斷的時候的流量肯定就等於初始的流量。事實上這也是容易證明的,藉助圖論中最基本的整個圖中出度之和等於入度之和即可。

那麼顯然我們有流量小於等於截邊容量,因為每條邊流過的流量是小於初始容量的。更進一步地,由截邊集選取的任意性,流量一定小於等於最小截的容量。只需要證明流量可以取到這個值。

顯然在容量網路中最大流存在。如果最大流流量嚴格小於某個截邊集的容量,則在截邊集之中至少存在一條邊“水沒灌滿”,也就是說流量小於截邊集容量,設這條邊為

a

。(好吧,這裡其實涉及到流向的方向問題,可以把方向不對的邊當成負的理解)。由截邊集定義(連通性)可以找到一條從發點到收點且經過這條“沒灌滿”的邊的路。我們把這條路上的所有邊的容量都改變一個值,使得這條邊“灌滿”(如果這樣做使得流量增大,則這條截邊集裡的邊是“正向”的,否則是“負向”的。對於負的邊我們將它變成正的)。但是由於反證假設的存在,這一過程是無法完成的:這個流已經是最大流了,它的容量不能變的更大了——也就是說這條路上有一條邊已經“滿”了,設其為

b

,並且

a \neq b

。我們把截邊集中的

a

換成

b

,仍然可以得到一個截邊集。繼續這種操作,直到無法繼續的時候,我們就得到了一個截邊集,其截邊的容量之和等於最大流流量,也就是最大流流量大於等於最小截。

綜上,最大流量=最小截容量。