最大流模版Dinic演算法

2021-07-02 02:16:37 字數 670 閱讀 6892

網路流的演算法有很多, 最基礎的為ek演算法, 他的時間複雜度為o(n*m^2), dinic演算法的時間複雜為o(m*n^2),dinic演算法是現構造層次圖,然後用阻塞流來增廣。構造層次圖有乙個bfs, 增廣是用dfs來寫。

詳細的講述請參考 劉汝佳寫的《演算法競賽入門經典訓練指南》 (大白書)

#include#include#include#include#includeusing namespace std;

const int maxn = 1000 + 10;

const int inf = 0x3f3f3f3f;

struct edge

};struct dinic

void addedge(int from, int to, int cap)

bool bfs()}}

return vis[t];

}int dfs(int x, int a)

}return flow;

}int max_flow(int s, int t)

return flow;

}};dinic solve;

int main()

printf("%d\n", solve.max_flow(1, n));

}return 0;

}

最大流 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演算法

之前簡單介紹了最大流之ford fulkerson演算法,此演算法時間複雜度為o f e 大多數情況下,這個演算法已經足夠高效了,但當頂點數或最大流流量非常大時,這個演算法就顯得不夠快了。下面簡單介紹易實現的dinic演算法。ford fulkerson演算法通過深度優先搜尋尋找增廣路,並沿著它增廣...