Cod sursa(job #275662)
#include <stdio.h>
#include <string.h>
#define NMAX 1001
#define INF 200000
int n, m, s, d, flux, c[NMAX][NMAX], f[NMAX][NMAX], t[NMAX];
struct NOD
{
int info;
NOD *next;
};
NOD *l[NMAX];
int minim(int a, int b)
{
return a < b ? a : b;
}
int BFS(int s, int d)
{
int p, u, nod, i, q[NMAX];
NOD *aux;
memset(t, 0, sizeof(t));
p = u = 0;
q[p] = s;
t[s] = -1;
while ( p <= u)
{
nod = q[p];
for ( aux = l[nod]; aux; aux = aux -> next)
if ( !t[aux -> info] && c[nod][aux -> info] - f[nod][aux -> info] > 0 )
{
u++;
q[u] = aux -> info;
t[aux -> info] = nod;
if ( aux -> info == d)
return 1;
}
p++;
}
return 0;
}
void flux_maxim()
{
int i, cr;
for ( flux = 0; BFS(s, d); flux +=cr)
{
cr = INF;
i = d;
while ( i != s)
{
cr = minim( cr, c[t[i]][i] - f[t[i]][i]);
i = t[i];
}
i = d;
while ( i != s)
{
f[t[i]][i] += cr;
f[i][t[i]] -= cr;
i = t[i];
}
}
printf("%d\n", flux);
}
int main()
{
int i, x, y, ca;
NOD *aux;
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for ( i = 1; i <= n; i++)
l[i] -> next = NULL;
for ( i = 1; i <= m; i++)
{
scanf("%d %d %d", &x, &y, &ca);
c[x][y] = ca;
aux = new NOD;
aux -> info = y;
aux -> next = l[x];
l[x] = aux;
// c[x][0]++;
}
s = 1;
d = n;
flux_maxim();
return 0;
}