參考博文:
之前參加阿里巴巴的筆試碰到一最大網路流的題目。因為之前沒有看過這類演算法,所以還是自然沒做出。今天抽空看了看。了解了下基本概念和求解流程。這裡簡單總結下。
本圖示最大流的乙個例項。由此,可以引出最大流的一些基本的定義和概念
可以這樣看,圖就是一種管道,管道有最大通過流量的限制,圖中邊的權值就是所謂的「容量」。同時,注意有唯一的源點和匯點。
這裡需要注意容量和流量的區別。其中f(u,v)的範圍需要額外注意,是 0<= f(u,v) <= c(u,v),不會出現所謂的負流量。下圖是對可行流的圖示
有了可行流,我們還需要求最大流
那麼如何求最大流呢。可以採用著名的ford fulkerson演算法
所以說,演算法的關鍵在於
1)何為增廣路徑,如何找出增廣路徑。
2)如何更新流量
說的直白些,所謂增廣路徑,就是找到這樣一條路徑,其流量不滿,未達到容量上限。
所有的可能的增廣路徑在一起便構成了殘留網路。
那麼,如何增廣呢。
其實,這裡的這個描述不太準確。下面我根據我的理解再解釋一下。
第一步,計算可增加流量
設某一增廣路徑上的節點為(a1,a2,a3,a4,....,an)
如果(u,v)是正向邊,則增加流量d = min
如果是逆向邊,則增加流量d = min
第二步,更新流量
如果(u,v)是正向邊,則 f(u,v) = f(u,v) + d
是逆向邊,則f(u,v) = f(u,v) - d
注意,如果是逆向邊,就是減法,當前管道從中減去部分流量,而且,伴隨著這部分減去的流量,必有另一部分管道的流量會增加。。而且,最後的總流量增加了d
結合上述演算法,可以詳細參閱下下列圖示
可以證明,可行流為最大流,當且僅當不存在新的增廣路徑。
總結一下最大流演算法
如何尋找增廣路徑,採用dfs和bfs的方法。然後在更新流量。
具體實現以後再給出。
源ppt鏈結
最大網路流
求網路流有很多演算法,這幾天學習了兩種,記錄一下ek演算法。首先是網路流中的一些定義 v表示整個圖中的所有結點的集合.e表示整個圖中所有邊的集合.g v,e 表示整個圖.s表示網路的源點,t表示網路的匯點.對於每條邊 u,v 有乙個容量c u,v c u,v 0 如果c u,v 0,則表示 u,v ...
最大網路流
1 基本概念和術語 1 網路 g 是乙個簡單有向圖,g v,e v 在 v 中指定乙個頂點 s 稱為源 和另乙個頂點 t 稱為匯 有向圖 g 的每一條邊 v,w e 對應有乙個值 cap v,w 0 稱為邊的容量 這樣的有向圖 g 稱作乙個網路 2 網路流 網路上的流 是定義在網路的邊集合 e 上的...
最大網路流
圖中有兩個點源結點s和匯點t。源結點是網路流的起點,匯點是流的終點 給定乙個流網路g 乙個源結點s 乙個匯點t,找到值最大的乙個流 定義 出發點為源點,接受流量 的匯聚點為匯點,邊上的權值為可以流過的最大值 殘存網路gf 由仍可以對流量進行增加 減少的邊構成 流過的量不超過容量的邊 包含原圖中的邊,...