網路最大流 Dinic

2021-10-02 02:54:16 字數 1190 閱讀 7194

存圖方式(鄰接表,鄰接矩陣),圖的遍歷(dfs,bfs)

我們舉個例子吧:

有乙個毒瘤水管工,他會造水管,有一天他造了乙個水管網路,就像乙個圖。其中有乙個點只有出邊,就是起點,還有乙個點只有入邊,是終點。

點之間有一些管子,這些管子都有單位時間內的容量,現在毒瘤水管工想知道,他的管子在單位時間裡在起點終點之間最多能流多少水。

増廣就是在殘餘網路中尋找從源點到匯點的可行路徑(増廣路),並將該路徑上的所有邊的容量減去路徑中的最小容量,形成新的殘餘網路

例如:如果當前有這樣乙個殘餘網路,那麼s→4

→1→t

s\rightarrow4\rightarrow1\rightarrow t

s→4→1→

t就是一條増廣路,最小容量是4,進行増廣過後就形成了這樣一張圖:

如何尋找増廣路?直接dfs即可。

有時候,程式増廣的時候會出現**性錯誤,例如還是那個圖:

有兩條増廣路,萬一程式選錯了怎麼辦?

這時就要請出反向邊了。

每次増廣的時候,在殘餘網路上逆著増廣路徑建容量與増廣路徑最小容量相等的反向邊,比如剛才那張圖,就順著t→1

→4→s

t\rightarrow1\rightarrow4\rightarrow s

t→1→4→

s建容量為4的邊。

這就給了程式乙個反悔的機會。

増廣

沿著増廣路徑建反向邊

如果源點與匯點依然連通,回到1

dinic的優化就是用bfs建立了由s開始的乙個分層圖,每次尋找増廣路時必須讓邊上的層數嚴格遞增,就可以確保每一步都離匯點近了一些這樣就不會陷入毒瘤資料卡成的死迴圈,比如這樣的著名毒瘤資料:

在這個資料中,如果用樸素演算法,就會讓中間容量為1的邊上下抖動抽搐,等到他抽了999次的時候才把上面和下面的999減沒。如果用dinic,兩次直接求出999+999。

404 not found(click for more information)

完結!

網路最大流 Dinic

dinic求最大流分為兩步 bfs構造層次圖 dfs尋找增廣路 字面理解,其實就是給圖分層 設源點為第0層 從源點出發最少只要一步可以到達的就是第1層 最少兩步到達的是第二層 依次類推直到匯點 如下圖所示 在網路流中 求取層次圖需要先判斷該邊是否有剩餘容量 若層次圖可以延伸到匯點 則說明最大流還可以...

網路最大流Dinic

1.什麼是網路最大流 形象的來說,網路最大流其實就是這樣乙個生活化的問題 現在有乙個由許多水管組成的水流系統,每一根管道都有自己的最大通過水流限制 流量 超過這個限制水管會爆 你麻麻就會來找你喝茶qwq 現在,給定你乙個出水口 原點 乙個出水口 匯點 求這個網路中水流量的最大值。看起來很簡單對不對?...

網路流最大流 Dinic演算法

o n 2 m 的演算法 比ek的o n m 2 優很多 ek通常解決10 3 10 4規模的網路 而dinic能解決10 4 10 5的網路 dinic演算法的思想也是分階段地在層次網路中增廣。它與最短增廣路演算法不同之處是 最短增廣路每個階段執行完一次bfs增廣後,要重新啟動bfs從源點vs開始...