標籤:路徑 演算法 blank 流程 tar 而不是 實現 為什麼 方法
轉自:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html
圖-1
-1所示,在這個運輸網路中,源點S和匯點T分別是1,7,各邊的容量為C(u,v)。圖中紅色虛線所示就是一個可行流。標準圖示法-2所示:
其中p(u,v) / c(u,v)分別表示該邊的實際流量與最大容量。
關於最大流
熟悉了什麼是網路流,最大流也就很好理解了。就是對於任意的u∈V-{s},使得p(s,u)的和達到最大。上面的運輸網路中,最大流-3所示:MaxFlow=p(1,2)+p(1,3)=2+1=3。
在介紹最大流問題之前,先介紹幾個概念:殘餘網路,增廣路徑,反向弧,最大流定理以及求最大流的Ford-Fulkerson方法。
殘餘網路 增廣路徑 反向弧
觀察-4,這種狀態下它的殘餘網路-5所示:
也許現在你已經知道什麼是殘餘網路了,對於已經找到一條從S 到T的路徑的網路中,只要在這條路徑上,把C(u,v)的值更新為C(u,v)-P(u,v),並且添加反向弧C(v,u)。對應的增廣路徑Path為殘留網路上從S到T的一條簡單路徑。圖-4中1,2,4,7就是一條增廣路徑,當然還有1,3,4,7。
此外在未做任何操作之前,原始的有向圖也是一個殘餘網路,它僅僅是未做任何更新而已。
最大流定理
如果殘留網路上找不到增廣路徑,則當前流為最大流;反之,如果當前流不為最大流,則一定有增廣路徑。
Ford-Fulkerson方法
介紹完上面的概念之後,便可以用Ford-Fulkerson方法求最大流了。為什麼叫Ford-Fulkerson方法而不是演算法,原因在於可以用多種方式實現這一方法,方式並不唯一。下面介紹一種基於廣度優先搜尋(BFS)來計算增廣路徑P的演算法:Edmonds-Karp演算法。
演算法流程如下:
設隊列Q:儲存當前未訪問的節點,隊首節點出隊後,成為已檢查的標點;
Path數組:儲存當前已訪問過的節點的增廣路徑;
Flow數組:儲存一次BFS遍曆之後流的可改進量;
Repeat:
Path清空;
源點S進入Path和Q,Path[S]<-0,Flow[S]<-+∞;
While Q非空 and 匯點T未訪問 do
Begin
隊首頂點u出對;
For每一條從u出發的弧(u,v) do
If v未訪問 and 弧(u,v) 的流量可改進;
Then Flow[v]<-min(Flow[u],c[u][v]) and v入隊 and Path[v]<-u;
End while
If(匯點T已訪問)
Then 從匯點T沿著Path構造殘餘網路;
Until 匯點T未被訪問
【轉】最大流EK演算法