經典演算法-最大流問題

jamesehng發表於2016-12-14

舉例描述

最大流問題是一個很經典的問題,很多人對此也很熟悉,它能夠等同於一個線性規劃問題。下面給出最大流問題的一個基本描述:如下圖所示,s是源點,t為匯點,每條邊上數字的含義是邊能夠允許流過的最大流量。可以將邊看成管道,0/3代表該管道每秒最多能通過3個單位的流量,0代表當前流量。最大流問題即是說,從s點到t點,最大允許流量是多少?

這裡寫圖片描述

公式描述

這裡寫圖片描述
的流量等於流出該點的流量。這個可以理解為流量守恆,就如同電流一樣,流入一個電阻的電流必然等於流出的電流。

那麼最大流就可以表示為:

這裡寫圖片描述

Ford-Fulkerson解法介紹

該方法依賴於三種重要思想:殘留網路,增廣路徑和割

Ford-Fulkerson思想

Ford-Fulkerson是一種迭代的方法。開始時,對所有的u,v屬於V,f(u,v)=0(這裡f(u,v)代表u到v的邊當前流量),即初始狀態時流的值為0。在每次迭代中,可以通過尋找一個“增廣路徑”來增加流值。增廣路徑可以看做是從源點s到匯點t之間的一條路徑,沿該路徑可以壓入更多的流,從而增加流的值。反覆進行這一過程,直到增廣路徑都被找出為止。

增廣路徑

舉個例子來說明下,如圖所示,每條紅線就代表了一條增廣路徑,當前s到t的流量為3。當然這並不是該網路的最大流,根據尋找增廣路徑的演算法我們其實還可以繼續尋找增廣路徑。

這裡寫圖片描述

殘留網路

顧名思義,殘留網路是指給定網路和一個流,其對應還可以容納的流組成的網路。具體說來,就是假定一個網路G=(V,E),其源點s,匯點t。設f為G中的一個流,對應頂點u到頂點v的流。在不超過C(u,v)的條件下(C代表邊容量),從u到v之間可以壓入的額外網路流量,就是邊(u,v)的殘餘容量(residual capacity),定義如下:

r(u,v)=c(u,v)-f(u,v)

舉個例子,假設(u,v)當前流量為3/4,那麼就是說c(u,v)=4,f(u,v)=3,那麼r(u,v)=1。

我們知道,在網路流中還有這麼一條規律。從u到v已經有了3個單位流量,那麼從反方向上看,也就是從v到u就有了3個單位的殘留網路,這時r(v,u)=3。可以這樣理解,從u到v有3個單位流量,那麼從v到u就有了將這3個單位流量的壓回去的能力。

我們來具體看一個例子,如下圖所示一個流網路

這裡寫圖片描述

對應的殘留網路:

這裡寫圖片描述

求解步驟舉例

1.獲得殘留網路

2.窮舉所有的增廣路徑

如下圖所示:

這裡寫圖片描述

計算最大流的標號法

這裡介紹計算網路最大流的簡便方法—標號法,此方法是Ford—Fulkerson 於1956年提出來的,它的原理是利用尋找增廣鏈來不斷改善可行流。 設μ是網路中 到 的一條鏈,規定 到 的方向為μ的方向。 μ上與μ的方向一致的弧稱為前向弧,前向弧的集合記為μ+, μ上與μ的方向相反的弧稱為後向弧,後向弧的集合記為μ-。

這裡寫圖片描述
上圖 若給一個可行流{},稱網路中 = 的弧為飽和弧,稱 <的弧為非飽和弧,稱 =0的弧為零流弧,稱 >0的弧為非零流弧。 增廣鏈:設{}是可行流, μ是 到 的一條鏈,若μ滿足下列條件,則稱μ為關於 f 的增廣鏈。(注意: f ={}) 1°對於任何( ,)∈μ+,0≤ < (前向弧為非飽和弧) 2°對於任何( ,)∈μ-,0 <≤ (後向弧為非零流弧)

參考:

http://blog.csdn.net/smartxxyx/article/details/9275177 http://blog.csdn.net/smartxxyx/article/details/9293665/ 以及: http://dec3.jlu.edu.cn/webcourse/t000048/yun/ch7_04.htm

相關文章