图论 —— 网络流
【概述】
網絡流是一個適用范圍極廣的模型,相關的算法也很多,大體分為最大流、最小割、費用流三類。
對于網絡流類型的題來說,一般根據題意,分析后建出圖后,套用相關模版,即可解決問題。
關于網絡流的基本概念與建模技巧:點擊這里
【算法】
1.最大流算法
求最大流算法分為兩類,一種是增廣路算法,一種是預留推進算法。
增廣路算法,常用的有時間復雜度 O(n*m*m) 的 FF 算法、EK 算法,上界為 O(n*n*m) 的 Dinic 算法,以及對 Dinic 進行改進的 ISAP 算法;壓入與重標記算法又稱預留推進算法,其時間復雜度為 O(n*n*m)
- FF 算法與 EK?算法:點擊這里
- Dinic 算法:點擊這里
- SAP 算法與 ISAP 算法:點擊這里
- 壓入與重標記算法:點擊這里
2.最大流最小割
求最大流的最小割時,根據最大流最小割定理,可以在求最大流的過程中求出最小割,一般常用的是?Dinic 算法。
- Dinic 算法:點擊這里
若網絡流的圖是一個平面圖,那么可以將其轉為對偶圖,然后跑最短路算法
- 平面圖與對偶圖:點擊這里
若要求最大權閉合子圖,可以轉為最小割問題,然后利用 Dinic 來解決
- 最大權閉合子圖:點擊這里
若要求最大密度子圖,那么需要利用 01 分數規劃來分析,從而轉換模型
- 01 分數規劃:點擊這里
3.費用流
一個網絡流圖中最大流的流量是唯一的,但是達到最大流量時,每條邊上的流量分配是不唯一的。?
若給網絡流圖中的每條邊都設置一個費用 cost,表示單位流量流經該邊時會導致花費 cost,那么在這些流量均為最大流的流量分配 f 中,存在一個流量總花費最小的最大流方案。
即:min{sum(cost(i, j)*f(i,j)},其中 cost?(i, j) 屬于方案 f 中的邊,f(i,j) 為邊 (i,j) 上的流量,f 為某一個最大流方案
求解最小費用最大流最常用的算法是基于 SPFA 的 MCMF 算法:點擊這里
由于 MCMF 算法是基于是 SPFA,而有時會卡 SPFA,因此除 MCMF 外,還有基于 Dijkstra 費用流:點擊這里
除以上兩種求費用流的方法外,還有一種更為高效的費用流算法,即 zkw 費用流:點擊這里
【例題】
除例題外,可參考?Edelweiss 的《網絡流建模匯總》,具體內容:點擊這里
1.最大流
2.最小割
3.費用流
總結
- 上一篇: 基础算法 —— 调度问题 —— 流水调度
- 下一篇: 字符串处理 —— 回文串相关 —— Ma