網路最大流入門

2021-09-07 16:27:28 字數 2116 閱讀 3820

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

在研究這個問題之前,讓我們先來學習一下前置知識

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

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

如果網路流圖中的流量滿足

則稱該流為乙個可行流

增廣:即增加一條路徑上的流量

增加一條路徑的流量,即減少這條路徑的當前流量上限,即$f(u,v)$的值

增廣是我們求解最大流的基礎

定義:在所有可行流中流量最大的流

那麼我們如何求解這個東西呢?

很顯然的一種思路就是找到整個網路中的容量上限最小的邊

增廣(就是加流量)這條路徑,不斷的重複

暫且不說這麼做時間複雜度如何

我們先考慮一下它的正確性。

這麼做貌似很有道理,

但是!以上圖為例,如只是無腦增廣的話,很可能對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哈哈~

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

ek(最簡單,比較慢)

dinic(最常見,效能良好)

isap/sap(也比較常見,效能很好)

最高標號預流推進(hlpp) (暫時還沒學。。)

前置重貼標籤(什麼鬼。。。)

推送重貼標籤(wtf......)

如果您會的話歡迎教一下本蒟蒻,感激不盡

由於想講的詳細一些,所以想了一下把每個演算法分開講吧,我會盡快更新噠:grinning:

(最近這幾天可能不太好辦了,因為博主在外面學(bei)習(nue),只有晚上才能更部落格)

網路流入門 用於最大流的Dinic演算法

posted 2011年05月2日 by comzyh 網路流博大精深 sideman語 感謝whd的大力支援 最早知道網路流的內容便是最大流問題,最大流問題很好理解 解釋一定要通俗 如右圖所示,有乙個管道系統,節點,有向管道,即有向圖一張.1 是源點,有無限的水量,4 是匯點,管道容量如圖所示.試...

網路流入門

網路流的最經典應用就是最大流.給定乙個圖.給出每條邊能流過的最大流量.求源點到匯點的最大流量.求解網路流的基本思想就是每次尋找增廣路 就是源點到匯點的一條可行路 然後ans 增廣路能流過的流量.更新剩餘網路.然後再做增廣路.直到做不出增廣路.關於網路流入門最難理解的地方就是剩餘網路了.為什麼在找到一...

網路流入門

通常可以把這些邊想象成道路,流量就是這條道路的車流量,容量就是道路可承受的最大的車流量。很顯然的,流量 容量。而對於每個不是源點和匯點的點來說,可以模擬的想象成沒有儲存功能的貨物的中轉站,所有 進入 他們的流量和等於所有從他本身 出去 的流量。求解思路 首先,假如所有邊上的流量都沒有超過容量 不大於...