Pagini recente » Cod sursa (job #1540504) | Cod sursa (job #2825175) | Cod sursa (job #1216799) | Cod sursa (job #1786261) | Cod sursa (job #1206350)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,m,c[1005][1005],f[1005][1005],x,y,z,mda[1005][1005],lista[1005],trecut[1005],prec[1005],sol;
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&z);
c[x][y]+=z;
mda[x][y]=1;
mda[y][x]=1;
}
bool advr=1;
while (advr==1)
{
memset(trecut,0,4020);
lista[0]=1; lista[1]=1; trecut[1]=1;
for (int i=1;i<=lista[0];++i)
{
int v=lista[i];
if (v!=n)
for (int j=1;j<=n;++j)
{
if (mda[v][j]==1 && trecut[j]==0 && c[v][j]>f[v][j])
{
++lista[0]; lista[lista[0]]=j; trecut[j]=1; prec[j]=v;
}
}
}
if (trecut[n]==1)
{
for (int i=1;i<n;++i)
{
if (mda[i][n]==1 && trecut[i]==1 && c[i][n]>f[i][n])
{
prec[n]=i;
int minim=c[i][n]-f[i][n],v=n;
while (v!=1)
{
if (minim>c[prec[v]][v]-f[prec[v]][v]) minim=c[prec[v]][v]-f[prec[v]][v];
v=prec[v];
}
v=n;
while (v!=1)
{
f[prec[v]][v]+=minim;
f[v][prec[v]]-=minim;
v=prec[v];
}
sol+=minim;
}
}
} else advr=0;
}
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}