網路流的演算法有很多, 最基礎的為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演算法通過深度優先搜尋尋找增廣路,並沿著它增廣...