Cod sursa(job #386871)
#include <cstdio>
#define DIM 1005
int n, m, c[DIM][DIM], T[DIM], fluxmaxim, QQ;
struct nod
{
int x;
nod *next;
};
void afisare()
{
for (int i = 1; i <= n; ++i)
{
printf("%d:", i);
for (int j = 1; j <= n; ++j)
printf ("%3d ", c[i][j]);
printf("\n");
}
}
int BFS()
{
nod *st = new nod, *dr, *t;
st -> x = 1;
st -> next = NULL;
dr = st;
int i, k;
for (i = 1; i <= n; ++i)
T[i] = -1;
T[1]=0;
while (st)
{
k = st -> x;
// printf("%d ",k );
for (i = 1; i <= n; ++i)
if (c[k][i] && T[i] == -1)
{
t = new nod;
t -> x = i;
t -> next = NULL;
dr -> next = t;
dr = t;
T[i] = k;
if(i==n){
// printf(" - %d\n",++QQ);
return 1;
}
}
t = st -> next;
delete st;
st = t;
}
return 0;
}
void EK(){
while(BFS()){
int i=n, cmin=1<<30;
int * t=T;
for(i=n ; t[i]; i=t[i])
if(c[t[i]][i]<cmin)
cmin=c[t[i]][i];
fluxmaxim+= cmin;
for(i=n ; t[i]; i=t[i]){
c[t[i]][i] -= cmin;
c[i][t[i]] += cmin;
}
}
}
int main()
{
FILE *f = fopen("maxflow.in", "r");
fscanf(f, "%d%d", &n, &m);
for (int i = 1, x, y, cc; i <= m; ++i)
fscanf(f, "%d%d%d", &x, &y, &cc), c[x][y]=cc;
fclose(f);
// afisare();
EK();
f = fopen("maxflow.out", "w");
fprintf(f, "%d\n", fluxmaxim);
fclose(f);
return 0;
}