網路流基礎、最大流最小割定理以及證明
網路流的基本概念
網路流問題都是建立在類似上圖的有向圖之上,有向圖的邊的權值代表容量。其中A代表源點,C代表匯點,一般考察的問題情景就是從A中流出流量,經過這些有向邊,最終彙集到C中。像這樣的具有源點和匯點,並且每條邊的權值均為正數的有向圖就被稱作是容量網路,圖中的這些邊被稱作是弧,弧的權值被稱作弧的容量,它代表著能夠通過這條弧的最大流量。而經過弧上的實際流量被稱作弧的流量,所有這些弧的流量所組成的集合就是所謂的網路流。
直觀上不難發現符合實際情況的網路流的特點,或者說是限制條件。首先每條弧上的流量不能超過其容量,還有對於除了源點和匯點以外的每個點來說,流入它的流量之和必須與從它流出的流量之和相等,即平衡條件。那麼滿足這兩個條件的網路流就被稱作是可行流
對於一串頂點序列,如果滿足是源點,是匯點,並且序列中每相鄰兩個頂點之間均存在一條弧,那麼就稱這個頂點序列為一條鏈,注意這裡並不要求這條弧的方向一定與有向圖中的方向一致,在鏈中,弧被分為前向弧和後向弧,前向弧指在鏈中頂點的順序與容量網路中弧的方向一致的弧,而後向弧則是方向不一致的弧。例如對於上圖而言,也是一條鏈,但是其中是前向弧,是後向弧。
有了鏈的定義就可以引出增廣路的概念,對於可行流的一條鏈,如果滿足:
1.中所有的前向弧的流量小於容量
2.中所有的後向弧的流量均大於零
那麼這條鏈就被稱作增廣路。為什麼要叫作增廣路呢?因為增廣路上的所有前向弧都是可以繼續新增流量的(增加的流量不能超過每條前向弧的容量與流量之差),而反向弧上的流量都是可以繼續減少的(減少的流量不能超過反向弧的流量),這兩種措施都會使得這個可行流的流量變得更大。
割指的是一個弧的集合,將這個集合中的所有弧刪除後原圖的基圖不再連通。割將原圖中的所有頂點劃分為兩個部分,在網路流問題中,一般考慮的都是S-T割:即割將原圖的頂點劃分為兩個部分S和T,源點∈S,匯點∈T。例如對於上圖,將頂點劃分為的這樣一個割就是S-T割。
對於割而言,也有流量和容量的概念。割的容量用表示,(E代表容量網路所有弧的集合),簡單來說割的容量就是中的所有點到中所有點的前向弧的容量之和。例如對上圖而言,割、的容量為。而對於割 ,它的容量為:。在所有的割中,容量最小的割被稱作最小割。
而割的流量指的是前向弧的流量之和減去後向弧的流量之和。因此割的流量小於等於割的容量,當且僅當割所劃分的兩個點集中不存在後向弧時取等。
最大流最小割定理及證明
網路流的最大流和最小割具有非常重要的實際意義,而這兩者之間有著非常重要的關係:最大流的流量=最小割的容量,這就是最大流最小割定理,下面就來證明這個定理。
命題1:對於可行流的任意一個割,割的流量=可行流的流量
證明:
採用歸納法來證明。設可行流的源點為,匯點為,割將容量網路劃分為,為除外所有頂點的集合。對於這個割而言,割的流量就代表著流入匯點的所有流量之和,因此割的流量就等於可行流的流量。
而其它的割都可以通過往中逐步新增頂點來獲取,向中新增一個頂點就意味著割的流量會減去到中所有頂點的流量之和,同時加上到中其餘各頂點的流量之和,而由可行流的平衡條件可知,減少的流量和新增的流量是相等的,因此割的流量不發生改變,即所有割的流量=割的流量=可行流的流量。
命題2:可行流的流量一定小於等於任意一個割的容量
證明:
由命題1顯然可得:可行流的流量=割的流量≤割的容量
命題3:對於可行流G,設其流量為f,如下三個命題等價:
1.存在一個割使得割的容量c=f
2.f是最大流的流量
3.G中不存在任何增廣路
證明:
:由命題2,任何一個可行流的流量都小於等於割的容量,即流量的上界是割的容量的最小值,而現在又存在一個割的容量與相等,假設不是最小割的容量,那麼存在,而又有,因此推出了矛盾,即一定是最小割的容量,達到了流量的上界,即是最大流的流量。
注意在證明這一點後是沒法說明最大流最小割定理的,因為1推出2只能說明如果存在一個割的容量等於流量,這個流量就是最大流流量,此時最大流流量=最小割容量,但是並不能說明這樣的一個割一定是存在的,要證明這一點必須要證明2能推出1。
:證明逆否命題:若G中存在增廣路,則f不是最大流的流量。由前面增廣路的定義可知,增廣路上的每條前向弧都可以繼續增加流量,後向弧可以繼續減少流量,這兩種措施都會導致最終的流量變大,因此f不是最大流的流量。
:G中不存在任何增廣路,意味著由源點到匯點的任何一條鏈中一定存在飽和前向弧(流量=容量)或者零流後向弧(流量=0)。這說明如果只通過非飽和前向弧和非零流後向弧絕對不可能從源點運動到匯點,那麼取割,其中為源點能夠通過非飽和前向弧和非零流後向弧到達的所有頂點構成的集合,T為剩下的點構成的集合,。中的所有點都不能通過非飽和前向弧和非零流後向弧到達,也就是說與之間的弧一定都是飽和前向弧或者零流後向弧,割的流量=前向弧流量-後向弧流量=前向弧流量-0=前向弧流量=前向弧容量=割的容量。因此一定存在一個割,滿足割的流量=割的容量。
由此就證明了這三個命題等價,同時論證了最大流最小割定理。
由此就不難想到求解最大流的演算法,可以在可行流G中不斷地尋找增廣路,如果不存在增廣路,此時可行流就是最大流;如果存在增廣路,就在增廣路上作修正。這樣不斷地迭代下去,知道不存在增廣路為止。而影響效能的最重要的一個地方就是如何查詢增廣路,不同的查詢方式會使的演算法的複雜度不同,這些演算法這將在下一篇中整理總結。