Cod sursa(job #626726)
#include <stdio.h>
#include <vector>
#include <cstring>
using namespace std;
#define NMAX 1010
#define INF (1<<30)
#define pb push_back
vector<int> A[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX];
int from[NMAX], viz[NMAX];
int cd[NMAX];
int N, M;
inline int min(int a, int b)
{
return (a<b)?a:b;
}
int BFS()
{
int V, i, j, node;
cd[0] = 1;
cd[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (i=1; i<=cd[0]; ++i) {
node = cd[i];
if (node == N)
continue;
for (j=0; j<A[node].size(); ++j) {
V = A[node][j];
if (C[node][V] == F[node][V] || viz[V])
continue;
viz[V] = 1;
cd[++cd[0]] = V;
from[V] = node;
}
}
return viz[N];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &N, &M);
int x, y, cost, i, flow, fmin;
for (i=1; i<=M; ++i) {
scanf("%d %d %d", &x, &y, &cost);
A[x].pb(y);
A[y].pb(x);
C[x][y] += cost;
}
for (flow = 0; BFS(); )
for (i=0; i<A[N].size(); ++i) {
int node = A[N][i];
if (C[node][N] == F[node][N] || !viz[node])
continue;
from[N] = node;
fmin = INF;
for (node = N; node != 1; node = from[node])
fmin = min(fmin, C[from[node]][node] - F[from[node]][node]);
if (fmin == 0)
continue;
for (node = N; node != 1; node = from[node]) {
F[from[node]][node] += fmin;
F[node][from[node]] -= fmin;
}
flow += fmin;
}
printf("%d", flow);
return 0;
}