最大流算法---Edmond-Karp
来源:互联网 发布:java内存泄露例子 编辑:程序博客网 时间:2024/06/05 19:40
这个算法是基于FF方法,就是通过不断求残余网络的增广路来增广流量,直到找不到增广路为止。注意:每次找到增广路以后都要更新原网络。EK算法通过BFS寻找源S到汇T的一条最短路径,因此时间复杂度是O(VE^2).
模板代码如下:
#include<iostream>#include<queue>#include<cstring>#include<cstdio>#define MAX 1000using namespace std;int res[MAX][MAX];int vis[MAX], pre[MAX];queue<int>q;int n;bool bfs(int s, int t){ int p; memset(vis, 0, sizeof(vis)); memset(pre, -1, sizeof(pre)); while(!q.empty() q.pop(); q.push(s); vis[s] = 1; while(!q.empty()) { p = q.front(); q.pop(); for(int i = 1;i <= n;i ++) { if(!vis[i] && res[p][i] > 0) { pre[i] = p; vis[i] = 1; if(i == t) return true; q.push(i); } } } return false;}int EdmondKarp(int s, int t){ int flow = 0, d, i, u; while(bfs(s, t)) { d = 1 << 30; u = t; while(pre[u] != -1) { d = min(d, res[pre[u]][u]); u = pre[u]; } u = t; while(pre[u] != -1) { res[pre[u]][u] -= d; res[u][pre[u]] += d; u = pre[u]; } flow += d; } return flow;}int main(int argc, char const *argv[]) { int m, u, v, w; freopen("in.c", "r", stdin); while(cin >> n >> m) { memset(res, 0, sizeof(res)); for(int i = 0;i < m;i ++) { cin >> u >> v >> w; res[u][v] += w; } int ans = EdmondKarp(1, n); cout << ans << endl; } return 0;}
0 0
- 最大流算法---Edmond-Karp
- 网络最大流 — Edmond Karp算法
- 最大流 — Edmond Karp算法
- 最大流 — Edmond Karp算法
- 最大流 — Edmond Karp算法
- 最大网络流Edmond-Karp算法
- 网络流—最大流(Edmond-Karp算法)
- 网络流—最大流(Edmond-Karp算法)
- 网络流—最大流(Edmond-Karp算法)
- 网络流最大流(代码)(Edmond-Karp算法)
- 网络流—最大流(Edmond-Karp算法)
- hdoj 3549 Flow Problem---最大流---Edmond Karp算法
- poj1273及最大流Edmond karp算法模板
- 图论最大流(Edmond Karp算法)
- POJ 1459-Power Network(最大流-Edmond-Karp算法)
- 最大流-EK(Edmond—Karp)算法
- 网络流Edmond-Karp算法
- POJ1459 Power Network【最大流】【Edmond-Karp】
- POJ 3468
- 线段树求矩形面积并 扫描线+离散化
- POJ 1151
- POJ 2104
- HDU 2665
- 最大流算法---Edmond-Karp
- HDU 3549
- POJ 1273
- Codeforce A. Milking cows
- HDU 4006
- POJ 2823
- HDU 4496
- 【转】OSAL内存管理1
- Codeforces 283A