网络流的水题,只需注意两点 :
1.具有多重边,例如:
3 2
1 2 4
1 2 5
1 2 6
输出是:15
2.测试数据有多组,且不是以输入N 为 0 结束。
//508K 16ms
#include <iostream>
#include <queue>
using namespace std;
#define INF 0x7fffffff
#define SIZE 205
int cap[SIZE][SIZE], flow[SIZE][SIZE];
int pre[SIZE], dist[SIZE];
int min(int a, int b)
{
return a > b ? b : a;
}
int Edmonds_Karp(int sta, int end, int size)
{
int max = 0, curr, i;
memset(flow, 0, sizeof(flow));
while(true)
{
memset(pre, 0, sizeof(pre));
memset(dist, 0, sizeof(dist));
queue<int> Q;
dist[sta] = INF;
pre[sta] = sta;
Q.push(sta);
while(!Q.empty())
{
curr = Q.front();
Q.pop();
for(i = 1; i <= size; i++)
{
if(!dist[i] && flow[curr][i] < cap[curr][i])
{
dist[i] = min(dist[curr], cap[curr][i]-flow[curr][i]);
pre[i] = curr;
Q.push(i);
}
}
}
if(dist[end] == 0)
break;
for(i = end; i != sta; i = pre[i])
{
curr = pre[i];
flow[curr][i] += dist[end];
flow[i][curr] -= dist[end];
}
max += dist[end];
}
return max;
}
int main()
{
int n, m, i, sta, end, c;
//freopen("a.txt", "r", stdin);
while(scanf("%d%d", &n, &m) != EOF)
{
memset(cap, 0, sizeof(cap));
for(i = 0; i < n; i++)
{
scanf("%d%d%d", &sta, &end, &c);
cap[sta][end] += c;
}
printf("%d\n", Edmonds_Karp(1, m, m));
}
return 0;
}