Cod sursa(job #271950)
#include<stdio.h>
#include<string.h>
#define nmax 50
int a[nmax][nmax][2],n,gasit,coada[nmax],s[nmax],f[nmax],i_c,sf_c,min,st,fin;
int abs(int x)
{
if (x<0)
return -x;
return x;
}
void refac(int nod)
{
if (nod!=st)
if (s[nod]>0)
{
if (min>a[s[nod]][nod][0] - a[s[nod]][nod][1])
min=a[s[nod]][nod][0] - a[s[nod]][nod][1];
refac(s[nod]);
a[s[nod]][nod][1]+=min;
}
else
{
if (min>a[nod][abs(s[nod])][1])
min=a[nod][abs(s[nod])][1];
refac(abs(s[nod]));
a[nod][abs(s[nod])][1]-=min;
}
}
void drum()
{
gasit=0;
i_c=sf_c=1;
coada[i_c]=st;
for(;i_c<=sf_c && coada[sf_c]!=fin; ++i_c)
for(int i=1;i<=n;++i)
if (a[coada[i_c]][i][0] - a[coada[i_c]][i][1]>0 && s[i]==0)
s[i]=coada[i_c] , coada[++sf_c]=i;
else
if (a[i][coada[i_c]][1]>0 && s[i]==0 && i!=st)
s[i]=-coada[i_c] , coada[++sf_c]=i;
if (coada[sf_c]==fin) gasit=1;
}
void rez()
{
gasit=1;
while (gasit)
{
memset(s,0,sizeof(s));
drum();
if (s[fin])
{
min=32000;
refac(fin);
}
}
}
int main()
{
int x,y,z,m;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
st=1;
fin=n;
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
a[x][y][0]=z;
}
rez();
int sol=0;
for(int i=1;i<=n;++i)
sol+=a[st][i][1];
printf("%d\n",sol);
return 0;
}