網絡最大流入門

前言

網絡最大流是網絡流中最基礎也是最重要的部分,後邊的許多模型也都是由最大流問題引伸而來的html

最大流

在研究這個問題以前,讓咱們先來學習一下前置知識算法

 

可行流

設$f(u,v)$表示邊$(u,v)$的當前容量上限網絡

設$c(u,v)$表示邊$(u,v)$的最大容量上限性能

若是網絡流圖中的流量知足學習

  • 源點$S$:流出量$=$流量總量
  • 匯點$T$:流入量$=$流量總量
  • 任意邊$(u,v)$:$0<=f(u,v)<=c(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哈哈~

實現

我目前見過的最大流算法有如下幾種

  1. EK(最簡單,比較慢)
  2. Dinic(最多見,性能良好)
  3. ISAP/SAP(也比較常見,性能很好)
  4. 最高標號預流推動(HLPP) (暫時還沒學。。)
  5. 前置重貼標籤(什麼鬼。。。)
  6. 推送重貼標籤(WTF......)

對於這些算法,博主給你們的建議是:

  • 理解第一種方法,並用代碼實現一次
  • 熟練掌握第二種算法,深入的理解其內涵,並能作到超級熟練的運用(起碼5min以內要敲出來&&沒有錯誤)
  • 理解第三種算法,並至少運用一次。(由於第三種算法跑的比較快,因此能夠用來搶排行榜$rank1$)
  • 第四五六中算法建議你們理解其內涵,代碼實現就無所謂了,由於基本用不到,不過學會了能夠用來裝13:joy:

 

另外,在書上看到過聽說可使用動態樹優化最大流算法,可是把百度翻遍了也沒找到代碼。。。

若是您會的話歡迎教一下本蒟蒻,感激涕零

 

因爲想講的詳細一些,因此想了一下把每一個算法分開講吧,我會盡快更新噠:grinning:

(最近這幾天可能不太好辦了,由於博主在外面學(bei)習(nue),只有晚上才能更博客)

相關文章
相關標籤/搜索