Cod sursa(job #237320)
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <vector>
using namespace std;
#define minim(a, b) ((a < b) ? a : b)
#define NMax 1024
int N, M, f[NMax][NMax], cap[NMax][NMax];
vector<int> G[NMax];
int q[NMax], up[NMax];
inline int BF(int sursa, int dest)
{
int ql, qr, sz, x, i;
memset(up, -1, sizeof(up));
for (q[qr=ql=0]=sursa, up[sursa]=0; qr <= ql; ++qr)
for (sz = G[q[qr]].size(), i = 0; i < sz; ++i)
if (up[x = G[q[qr]][i]] == -1 && f[q[qr]][x] < cap[q[qr]][x])
{
q[++ql] = x;
up[x] = q[qr];
if (x == dest)
return 1;
}
return 0;
}
int max_flow()
{
int i, j, r, cnt = 0;
for (; BF(1, N); )
{
for (i = 1; i < N; ++i)
if (up[i] != -1 && f[i][N] < cap[i][N])
{
r = cap[i][N] - f[i][N];
for (j = i; j != 1 && r > 0; j = up[j])
r = minim(r, cap[up[j]][j] - f[up[j]][j]);
if (r == 0) continue;
f[i][N] += r; f[N][i] -= r;
for (j = i; j != 1; j = up[j])
f[up[j]][j] += r,
f[j][up[j]] -= r;
cnt += r;
}
}
return cnt;
}
int main()
{
int i, j;
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &N, &M);
assert(1 <= N && N <= 1000);
assert(1 <= M && M <= 5000);
for (; M; --M)
{
scanf("%d %d", &i, &j);
G[i].push_back(j);
G[j].push_back(i);
scanf("%d", &cap[i][j]);
assert(1 <= cap[i][j] && cap[i][j] <= 110000);
}
printf("%d\n", max_flow());
return 0;
}