标签:poj 网络流 edmonds_karp算法
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 59219 | Accepted: 22740 |
Description
Input
Output
Sample Input
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
Sample Output
50
Source
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int const MAX = 205;
int m, n;
int c[MAX][MAX]; //边容量
int f[MAX][MAX]; //边实际流量
int pre[MAX]; //记录增广路的路径
int a[MAX]; //残余网络
int Edmonds_Karp(int s, int t)
{
int ans = 0;
queue <int> q;
while(true)
{
memset(a, 0, sizeof(a));
a[s] = INT_MAX; //源点标号设为无限大
q.push(s);
while(!q.empty()) //利用BFS找增广路
{
int u = q.front();
q.pop();
for(int v = 1; v <= n; v++)
{
//某点未被增广且该点的容量大于流量
if(!a[v] && c[u][v] > f[u][v])
{
q.push(v);
//求得s-v路径上的最大改进量,即最小残量
a[v] = a[u] < c[u][v] - f[u][v] ? a[u] : c[u][v] - f[u][v];
pre[v] = u;
}
}
}
//若找不到增广路则退出
if(a[t] == 0)
break;
//从汇点沿着记录的增广路路径往源点走
for(int u = t; u != s; u = pre[u])
{
f[pre[u]][u] += a[t]; //更新正向流量
f[u][pre[u]] -= a[t]; //更新反向流量
}
ans += a[t]; //加上改进量
}
return ans;
}
int main()
{
int u, v, w;
while(scanf("%d %d", &m, &n) != EOF)
{
memset(c, 0, sizeof(c));
memset(f, 0, sizeof(f));
//初始化容量网络,开始为零流
for(int i = 0; i < m; i++)
{
scanf("%d %d %d", &u, &v, &w);
c[u][v] += w; //可能有重边,需叠加
}
printf("%d\n", Edmonds_Karp(1, n));
}
}POJ 1273 Drainage Ditches (网络流最大流基础 Edmonds_Karp算法)
标签:poj 网络流 edmonds_karp算法
原文地址:http://blog.csdn.net/tc_to_top/article/details/44117083