Cod sursa(job #721088)
#include <stdio.h>
#include <string.h>
int n,m,a[1005][1005],b[1005][1005],t[1005],s,f,inf=999999;
void read(){
FILE *fin=fopen("maxflow.in","r");
fscanf(fin,"%d %d\n",&n,&m);
s=1;
f=n;
int i,x,y,z;
for(i=1;i<=m;i++){
fscanf(fin,"%d %d %d\n",&x,&y,&z);
a[x][y]=z;
}
fclose(fin);
}
int drum(){
int p,u,c[1005],i,nod;
c[1]=s;
p=u=1;
t[s]=s;
while(p<=u){
nod=c[p];
for(i=1;i<=n;i++){
if(a[nod][i]-b[nod][i]>0){
if(t[i]==0){
u++;
c[u]=i;
t[i]=nod;
if(i==f)
return 1;
}
}
}
p++;
}
return 0;
}
void imbunatatire(int k,int &min){
if(k!=s){
if(min>a[t[k]][k]-b[t[k]][k]&&a[t[k]][k]-b[t[k]][k]>0)
min=a[t[k]][k]-b[t[k]][k];
imbunatatire(t[k],min);
b[t[k]][k]+=min;
}
}
void write(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
printf("%d ",b[i][j]);
printf("\n");
}
}
void write_drum(int k){
if(k==s){
printf("%d ",s);
}
else{
printf("%d ",k);
write_drum(t[k]);
}
}
int main(){
read();
int sw=drum(),min,i;
while(sw){
min=inf;
imbunatatire(f,min);
memset(t,0,sizeof(t));
sw=drum();
}
int sum=0;
for(i=1;i<=n;i++)
sum+=b[s][i];
freopen("maxflow.out","w",stdout);
// write();
printf("%d\n",sum);
fclose(stdout);
return 0;
}