網絡最大流是網絡流中最基礎也是最重要的部分,後邊的許多模型也都是由最大流問題引伸而來的html
在研究這個問題以前,讓咱們先來學習一下前置知識算法
設$f(u,v)$表示邊$(u,v)$的當前容量上限網絡
設$c(u,v)$表示邊$(u,v)$的最大容量上限性能
若是網絡流圖中的流量知足學習
則稱該流爲一個可行流優化
增廣:即增長一條路徑上的流量spa
增長一條路徑的流量,即減小這條路徑的當前流量上限,即$f(u,v)$的值3d
增廣是咱們求解最大流的基礎code
定義:在全部可行流中流量最大的流htm
那麼咱們如何求解這個東西呢?
很顯然的一種思路就是找到整個網絡中的容量上限最小的邊
增廣(就是加流量)這條路徑,不斷的重複
暫且不說這麼作時間複雜度如何
咱們先考慮一下它的正確性。
這麼作貌似頗有道理,
可是!
以上圖爲例,如只是無腦增廣的話,極可能對SABT這條邊進行增廣,而增廣完這條邊後,就再也沒有能夠增廣的路徑了,求出的最大流爲$3$,下圖爲增廣後的網絡流圖
很顯然,這麼作是錯的,由於咱們能夠分別增廣$SAT$,$SBT$這兩條路徑,獲得的流量爲$6$
那怎麼解決這個問題呢?
咱們須要引入一個很是重要的概念——反向邊
例如,對於$SA$這條容量爲$3$的邊,咱們能夠認爲存在一條容量爲$0$的邊$AS$與之對應,對於$SA$進行增廣,即減少它的容量上限,至關於增大$AS$的容量上限
也就是說,咱們容許從$SA$流出的流量倒流回去,給它一個悔改的機會
這樣,對於上圖而言,咱們能夠藉助反向邊來更改本身的錯誤操做,創建反向邊後的圖以下圖所示
這樣咱們便又有了一條新的增廣路$SBAT$,對這條路徑進行增廣後咱們即可以獲得網絡最大流爲$5$
考慮一下,爲何這樣是對的?
緣由很簡單,形成咱們剛開始作出錯誤決策的邊爲$AB$,最大流本不該通過這裏,可是咱們卻無腦的通過了這裏
由於反向邊$BA$的存在,咱們又把從$A$流向$B$的流量給退了回去。這就至關於沒有通過$AB$這條邊
(本節如下內容讀者能夠直接略過,屬於本蒟蒻瞎扯,可能把讀者帶到溝裏面,目前已有一人受害)
反向弧到這裏本就應該結束了,可是本蒟蒻在學習的過程當中一直有個問題不明白
爲何加反向弧是對的?
若是不考慮反向弧,咱們選擇的路徑爲$SAT$,$SBT$,可是加了反向弧以後咱們的路徑貌似不是這麼選的啊。。
尤爲是$AT$這條邊的流量,本應該是從$SA$流過來,但實際是從$SB$流過來。
這樣爲何是對的呢?
這個問題我思考了很長時間,最終得出了一個很不靠譜的結論
由於通過$AB$這條邊的流量爲$SA,AB,BT$的最小值,而後xjb分狀況討論一下,%……&*()()*&……%¥)(大概要分個一二十種狀況吧,而後發現都是對的,其實就是各邊之間的流量等效替代問題。。。)
看到這兒的同窗,恭喜大家被帶到坑裏啦O(∩_∩)O哈哈~
我目前見過的最大流算法有如下幾種
對於這些算法,博主給你們的建議是:
另外,在書上看到過聽說可使用動態樹優化最大流算法,可是把百度翻遍了也沒找到代碼。。。
若是您會的話歡迎教一下本蒟蒻,感激涕零
因爲想講的詳細一些,因此想了一下把每一個算法分開講吧,我會盡快更新噠:grinning:
(最近這幾天可能不太好辦了,由於博主在外面學(bei)習(nue),只有晚上才能更博客)