之前雖然刷了大概一百道網路流的題目,但是始終是把網路流當作黑盒演算法來學。我大概知道了網路流能做什麼。
但是對於網路流的**細節我還是一竅不通。特此寫一篇博文來整理,我對網路流的理解。
這個演算法是一切網路流演算法的基礎,其最重要的貢獻就是增廣路定理:找不到增廣路的時候,此時的累加流量就是最大流。
所以這個演算法最主要的地方就是尋找增廣路——每次dfs尋找從s到t路徑上流量最小的邊。
之後便是殘餘網路的概念。每次找到增廣路之後都修改殘餘網路。直到不存在增廣路的時候,演算法結束。
缺陷:因為每次都是dfs所以,太不穩定,會被值域所影響。如下圖,源自
有可能會在1-2之間進行466666666次過程。
ek演算法是上面演算法的多項式優化版本。最主要的地方就是用bfs代替了dfs使得每次增廣的都是最短路。
源自上面鏈結。
侷限:ek演算法的劣勢就在於, 每次遍歷了一遍殘量網路之後只能求出一條增廣路來增廣。
相較於ek演算法,dinic的複雜度更為優秀。dinic最重要的思想就是引入了分層圖,讓流只能往下一層流。
每次跑dfs都能實現多路增廣,增廣完之後重新bfs建分層圖。一旦建不了分層圖那麼演算法結束。
其中我們說說dinic**細節。(bfs就是裸的分層,所以主要是dfs)
inline ll dfs(int當前弧優化:每次dfs都會訪問一些邊,當前弧優化就是讓你dfs的時候直接從不重複的地方開始。u, ll flow)
}return flow - del;//
返回本次增廣的流量
}
del優化:為什麼要設計乙個del,通過flow-del來返回增廣流量呢?我的理解是,del的意義是可行上界,意思就是有這麼多流量流進來。那麼我們很容易知道當上界為0的時候肯定就不能增廣了,所以直接break。
整理再出發
工作和學習佔據了生活的大部分時間,周麼也幾乎沒有給自己計畫放鬆的時間,導致最近身體的疲勞,心情狀態也一般,結果是學沒學進去,工作也沒有多大精力。比如昨天晚上,也是像往常一樣去了自習室,但是在自習室中卻靜不下心,逛逛微博 論壇,時間浪費的很快。都到晚上十點了,什麼也沒學懂,更別說寫文章了。晚上在回來的...
老驥伏櫪再出發
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
沉澱,再出發
有這樣的一年,它為我們帶來了 網際網路 也帶來了由此而生的乙個又乙個風口 有這樣的一年,它讓我們看到了大資料的厚積薄發 雲計算的逐步落地及中國製造2025即將展開的全新格局 有這樣的一年,充滿了收購 融合 轉型 資訊化再出發的種種碰撞與積澱。它正是即將與我們揮手告別的2015年,它因飽含機遇與挑戰而...