具體的最大流的定義及原理可以參見這位朋友的部落格(簡單易懂)
最大流問題詳解(侵刪)
dinic演算法的基本原理
利用bfs對圖進行分層處理,接著使用dfs從s開始,每次層次加一尋找下乙個點,直至達到匯點t,然後再回溯回去,以此遍歷所有的增廣路徑,這樣就可以滿足我們同時求出多條增廣路的需求,效率更高
因此可給出dinic演算法的進行框架
①在殘量網路上通過bfs求出結點的層次,構造分成圖。
②在分層圖上通過dfs尋找增廣路,在回溯時同時更新邊權。
更加具體的原理可以參見這位朋友的部落格
**網路最大流 (侵刪)
**部分
下面給出帶有注釋的**(**為借鑑上述部落格中**並增添詳細解釋)
#include
using
namespace std;
const
long
long inf=
2225020666
;int n,m,s,t,u,v;
long
long w,ans,dis[
1005000];
int tot =
1, now[
1005000
], head[
1005000];
/*dis陣列用以設定每個點的層數,head陣列用以構造圖,now陣列用以當前弧優化*/
struct node e[
1005000];
void
add(
int u,
int v,
long
long w)
intbfs()
}}return0;
//隊空返回0,結束dfs遍歷
}int
dfs(
int x,
long
long sum)
}return res;
}int
main()
while
(bfs()
)printf
("%lld"
,ans)
;return0;
}
最大流 Dinic演算法
ford fulkerson演算法是通過深度優先搜尋尋找增廣路,並沿著它增廣。與之相對,dinic演算法總是尋找最短的增廣路,並沿著它增廣。因為最短增廣路的長度在增廣過程中始終不會變短,所以無需每次都通過寬度預先搜尋來尋找最短增廣路。我們可以先進行一次寬度優先搜尋,然後考慮由進距離頂點指向遠距離頂點...
Dinic演算法求最大流
include using namespace std const int oo 1e9 無窮大 const int maxm 111111 邊的最大數量,為原圖的兩倍 const int maxn 999 點的最大數量 int node,src,dest,edge node節點數,src源點,de...
最大流模版Dinic演算法
網路流的演算法有很多,最基礎的為ek演算法,他的時間複雜度為o n m 2 dinic演算法的時間複雜為o m n 2 dinic演算法是現構造層次圖,然後用阻塞流來增廣。構造層次圖有乙個bfs,增廣是用dfs來寫。詳細的講述請參考 劉汝佳寫的 演算法競賽入門經典訓練指南 大白書 include i...