最大流(Max Flow)
最大流(Max Flow)
一、流網絡
G=(V,E)是一個有向圖,其中每條邊(u,v)有一個非負的容量值c(u,v),而且如果E中包含一條邊(u,v),那么圖中就不存在它的反向邊。在流網絡中有兩個特殊的結點,源結點s和匯點t。
下面給出流網絡的形式化定義。令G=(V,E)為一個流網絡,其容量函數為c,設s我為網絡的源點,t為匯點。G中的流是一個實值函數f,滿足以下兩條性質:
1. 容量限制(capacity contraint):對于所有的結點u,v,要求
2. 流量守恒(flow conservation):對于所有的非源點和匯點的結點u,要求:
下圖是一個流網絡的示例圖,幫助大家理解,其中的“/”只是分隔符而不是運算符,“/”前代表的是流的值,后面的數值則是該條邊的容量(capacity):
流網絡常見的一種應用場景是運輸問題,需要將貨物從s運輸到t,途經幾個中轉站,每次運輸到每個中轉站的貨物的數量是有限制的。在實際應用中我們可能會在某條邊上雙向運輸,這樣便違反了我們之前對流網絡的定義,但是我們可以將包含反平行邊的圖來改造成流網絡,具體的方法是引入一個是虛構的中轉結點,方法如下圖。
考慮另外一種特殊情形,從多個工廠發(fā)出貨物最終運輸到別的多個工廠,這時候我們具有了多個源點和多個匯點,這也很好解決,解決的方法就是人為添加超級源點(supersource)和超級匯點(supersink),具體方法見下圖。
二、Ford-Fulkerson方法
將實際問題轉化成流網絡后,我們就可以來解決最大流問題了。理解這個方法需要先理解幾個關于流網絡的基礎概念。
1. 殘存網絡(residual network)
假定有一個流網絡G=(V,E),其源點為s,匯點為t,f為G中的一個流。對即誒點對u,v,定義殘存容量(residual capacity),有:
殘存網絡可能包含圖G中不存在的邊,殘存網絡中的反向邊允許算法將已經發(fā)送出來的流量發(fā)送回去。一個殘存網絡示例圖如下:
圖a是一個流網絡,b是a對應的殘存網絡,注意每條邊上的值,殘存網絡中針對每條正向邊計算出該條邊在存在流的情況下的剩余容量,并畫出一條反向邊,反向邊的容量即是發(fā)出流的大小,方便將發(fā)出的流運輸回發(fā)送地,并將權重為0的邊省略。
殘存網絡是如何增大原始流網絡中的流的一種指示。如果f是G的一個流,對應的有一個殘存網絡,殘存網絡中我們可以定義一個流。此時我們可以定義一個函數,我們將其稱作流對f的增量(augmentation)。
2. 增廣路徑(augmenting paths)
給定流網絡G和流f,增廣路徑p是殘存網絡中一條從源結點s到匯點t的簡單路徑。根據殘存網絡的定義,對于一條增廣路徑上的邊(u,v),我們可以增加其流量的幅度最大為,即我們之前定義的殘存容量(residual capacity)。我們將這里討論的情形總結成一條引理:
引理 設G為一個流網絡,設f為圖G中的一個流,設p為殘存網絡中的一條增廣路徑。定義一個函數如下:
其中是殘存網絡中的一個流,其值。
推論?設G為一個流網絡,設f為G中的一個流,設p為殘存網絡中的一條增廣路徑。設如上述引理所定義,假定將f增加的量,則函數是圖G中的一個流,其值為。
3. 流網絡的切割(cuts of networks)
流網絡G中的一個切割(S,T)將結點集合V劃分為S和T=V-S兩個集合,使得、。若f是一個流,則定義橫跨切割(S,T)的凈流量f(S,T)如下:
切割(S,T)的容量是:
一個網絡的最小切割是整個網絡中容量最小的切割。
舉例說明切割的計算方法:
橫跨該切割的凈流量:
該切割的容量:
引理?設f為流網絡G的一個流,該流網絡的源結點為s,匯點為t,設(S,T)為流網絡G的任意切割,則橫跨切割(S,T)的凈流量為。
推論 流網絡G中任意流f的值不能超過G的任意切割的容量。
定理(最大流最小切割定理) 設f為流網絡G=(V,E)中的一個流,該流網絡的源結點為s,匯點為t,則下面的條件是等價的:
1. f是G的一個最大流。
2. 殘存網絡不包含任何增廣路徑
3. |f|=c(S,T),其中(S,T)是流網絡G的某個切割。
4. 基本的Ford-Fulkerson算法
在Ford-Fulkerrson方法的每次迭代中,尋找某條增廣路徑p,然后使用p來對流f進行修改(增加)。我們不斷地在圖中尋找增廣路徑,并依據來增大f的值,直到圖中不含增廣路徑。偽代碼實現如下:
Ford-Fulkerson算法的運行時間取決與尋找增廣路徑的方法,這也是Edmonds-Karps算法對基礎Ford-Fulkerson算法做改進的理論基礎。
我們在殘存網絡中選擇的增廣路徑是一條從源結點s到匯點t的最短路徑,其中每條邊的權重為單位距離,我們稱如此實現的Ford-Fulkerson算法為Edmonds-Karp算法。
?
?
?
?
其他參考:
https://www.jianshu.com/p/efb2d79e2b0f
總結
以上是生活随笔為你收集整理的最大流(Max Flow)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010问题汇总
- 下一篇: [转载]使用jquery实现用户名验证