最大網絡流問題


之前參加阿里巴巴的筆試碰到一最大網絡流的題目。因為之前沒有看過這類算法,所以還是自然沒做出。今天抽空看了看。了解了下基本概念和求解流程。這里簡單總結下。

主要內容來自百度文庫某ppt。在每幅圖片的下面我會給出一些說明性文字。

本圖示最大流的一個實例。由此,可以引出最大流的一些基本的定義和概念

可以這樣看,圖就是一種管道,管道有最大通過流量的限制,圖中邊的權值就是所謂的“容量”。同時,注意有唯一的源點和匯點。

這里需要注意容量和流量的區別。其中f(u,v)的范圍需要額外注意,是 0<= f(u,v) <= c(u,v),不會出現所謂的負流量。下圖是對可行流的圖示

有了可行流,我們還需要求最大流

那么如何求最大流呢。可以采用著名的Ford Fulkerson算法

所以說,算法的關鍵在於

1)何為增廣路徑,如何找出增廣路徑。

2)如何更新流量

說的直白些,所謂增廣路徑,就是找到這樣一條路徑,其流量不滿,未達到容量上限。

所有的可能的增廣路徑在一起便構成了殘留網絡。

那么,如何增廣呢。

其實,這里的這個描述不太准確。下面我根據我的理解再解釋一下。

第一步,計算可增加流量

設某一增廣路徑上的節點為(a1,a2,a3,a4,....,an)

如果(u,v)是正向邊,則增加流量d = min{ c(ai,aj) - f(ai,aj) | j = i +1, i =1,2,3...,n-1}

如果是逆向邊,則增加流量d = min{ f(ai, aj) | j = i +1, i =1,2,3...,n-1}

第二步,更新流量

如果(u,v)是正向邊,則 f(u,v) = f(u,v) + d

是逆向邊,則f(u,v) = f(u,v) - d

注意,如果是逆向邊,就是減法,當前管道從中減去部分流量,而且,伴隨着這部分減去的流量,必有另一部分管道的流量會增加。。而且,最后的總流量增加了d

結合上述算法,可以詳細參閱下下列圖示

可以證明,可行流為最大流,當且僅當不存在新的增廣路徑。

總結一下最大流算法

如何尋找增廣路徑,采用DFS和BFS的方法。然后在更新流量。

具體實現以后再給出。

源PPT鏈接http://wenku.baidu.com/view/7ed3c241a8956bec0975e32b.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM