網路流的dinic優化(低幼向實現,無證明)

2021-07-16 15:39:23 字數 606 閱讀 7679

網路流這種東西優化有很多種,比如sap,預流推進(其實那是另一種網路流,不算增廣路了),單個人覺得最好寫,同時效率不低的還是dinic(簡易縮水版)。

要談網路流首先你得知道ek演算法吧,就是最簡單的最大流。傳統的最大流複雜度上限應該是n*m*m。

而dinic演算法其實說難也不難,它好就好在非常好寫。首先,我們有乙個概念叫做「層次網路」。它是什麼東西?簡單來說,就是在最大流上從源點做一次bfs,我們新建一張圖,每次碰到乙個新的節點,我們就把它的深度定為找到它的點+1(源點深度為0),在新的圖中保留該邊。如果找到已經查過的節點,那麼除非查過的節點的深度是當前正在bfs的節點的深度+1,那麼我們在新圖中保留這條邊,否則不理它=w=。沒錯,這東西就是層次網路了。

而對於這樣一張圖,我們每次只要每次找到一條路能夠到匯點就萬事ok了,因為這就是一條增廣路。我們通過dfs的方法去找增廣路。而對於每乙個層次網路,我們最多能夠增廣m次,因為每增廣一次,就必然減少一條邊(這個去看ek網路流吧,有證明)。

總結:我們最多構造n個層次網路(這個我也不會證=w=,但好像很有可信度),每個層次網路花費m的代價去bfs才能建好,而每建好乙個網路,我們最多花費m次代價為n的dfs去增廣,這樣複雜度就是n*(m+n*m),差不多就是n*n*m,複雜度就低了。

網路流 最大流 dinic 當前弧優化 模板

用法 在原有向圖的基礎上,增加源點s和匯點t,並將s與左子集建邊,t與右子集建邊 邊權都設為1,則就是求二分圖最大匹配 右子集與t的邊權大於1,則就是求二分圖最大多重匹配 模板 const int n 210 struct edge edge n n 邊數 int head n cnt void a...

網路流 加上了當前弧優化的Dinic演算法

測試題目 題目背景 滾粗了的hansbug在收拾舊語文書,然而他發現了什麼奇妙的東西。題目描述 蒟蒻hansbug在一本語文書裡面發現了一本答案,然而他卻明明記得這書應該還包含乙份練習題。然而出現在他眼前的書多得數不勝數,其中有書,有答案,有練習冊。已知乙個完整的書冊均應該包含且僅包含一本書 一本練...

我的dinic演算法網路流(詳註解)

題目大意 求乙個圖中起點s到終點t的最大流除以s到t的的所有路徑中的最大流量的那條路徑流量值 雖然這樣看起來比較簡單,但說實話,這題我讀題至少都花了半個小時,直到ac的的前一秒我都有點怕題意讀錯 此題主要要求兩個量 整個圖的最大流和一路徑的最大流量值 最大流maxflow沒什麼好說的,直接套模板 不...