Pagini recente » Cod sursa (job #2263497) | Cod sursa (job #2877919) | Cod sursa (job #1740184) | Cod sursa (job #1202146) | Cod sursa (job #1467766)
#include <stdio.h>
#include <cstring>
int c[1005][1005];
int lm[1005][2005];
int nr[1005];
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int n,m;
scanf("%d %d",&n,&m);
for (int i=1; i<=m; ++i)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
++nr[x];
lm[x][nr[x]]=y;
++nr[y];
lm[y][nr[y]]=x;
c[x][y]=z;
}
int f_total=0;
int marit=1;
while (marit > 0)
{
marit=0;
int trecut[1005];
int parcurs[1005],l;
int prec[1005];
memset(trecut,0,1005*sizeof(int));
trecut[1] = 1;
parcurs[1]=1;
l=1;
prec[1]=0;
int i=1;
while (i<=l)
{
int nod=parcurs[i];
for (int j=1; j<=nr[nod]; ++j)
{
if (c[nod][lm[nod][j]]>0 && trecut[lm[nod][j]]==0)
{
++l;
parcurs[l]=lm[nod][j];
prec[l]=i;
trecut[lm[nod][j]]=1;
}
}
++i;
}
for (int i=1; i<=l; ++i)
{
int nod=parcurs[i];
if (c[nod][n]>0)
{
int minim=c[nod][n];
int j=i;
while (j!=1)
{
if (minim>c[parcurs[prec[j]]][parcurs[j]])
{
minim=c[parcurs[prec[j]]][parcurs[j]];
}
j=prec[j];
}
if (minim>0)
{
j=i;
c[parcurs[i]][n]-=minim;
c[n][parcurs[i]]+=minim;
while (j!=1)
{
c[parcurs[prec[j]]][parcurs[j]]-=minim;
c[parcurs[j]][parcurs[prec[j]]]+=minim;
j=prec[j];
}
marit+=minim;
}
}
}
f_total+=marit;
}
printf("%d",f_total);
fclose(stdin);
fclose(stdout);
return 0;
}