關於dinic演算法中當前弧如何優化問題

2021-08-15 16:45:02 字數 739 閱讀 1309

剛開始學最大流dinic演算法時,並沒有運用優化,但是也解決了一些題。後來在做hdu的3572時,一直超時,被卡時間。所以上網查了下,了解到dinic中必須要加當前弧優化才可以過。然後查了下當前弧優化是什麼鬼,網上的解釋也是比較模糊,自己便思考了一番,於是說一下自己的想法。

當前弧優化就是為了防止走重複的邊,從而較少了時間。

int dfs(int k,int y)

}return 0;

}

我們知道dinic演算法中的dfs是為了在可行增廣路中找到最小容量。而找增廣路需要遍歷每個點所連線的邊,直至找到一條可到達終點的路。例如,我們在第一次dfs時找到了一條增廣路:頂點1中的第3條邊,頂點2中的第4條邊,頂點3中的第4條邊,頂點5中的第2條邊。這四條邊是我們在第一次dfs尋找到的可行路,我們可以看到,每次找增廣路時都是從某個頂點所連線的第一條邊開始,那也就是說從頂點1中的第1條邊接著去找沒找到,從而遍歷到頂點1中的第3條邊,接著去找發現頂點2中的前三條邊也沒找到。。。這樣下去直到找到終點。那麼,我們可以知道下次dfs時,頂點1的前兩條邊沒用(下次bfs或者幾次bfs後可能會有用),直接從頂點1的第三條邊開始去找。

當我們將當前圖的所有增廣路都找到後,再次bfs分層,當前圖的層次會發生變化,然後我們在從頂點1開始去找,所以我們每次bfs,都要清一下陣列cur。

while(bfs())

鄙人語言能力不強,能力有限,如果有錯誤和漏洞,請各位大佬批評指正,謝謝。

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

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

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

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

關於Dinic演算法的幾點討論

dinic演算法是經典的網路最大流演算法,該演算法由在ek演算法的基礎上增加 分層 這一概念得到。演算法複雜度為 分層操作 演算法主體 dinic 最終,我們在不斷分層和由源點進行dinic演算法的過程中獲得了整體的最大流。include include include includeusing n...