Pagini recente » Istoria paginii preoni-2007/runda-2/solutii | Cod sursa (job #2696129) | Cod sursa (job #716077) | Statistici Danila Sebastian (UTCN_DANILA_SEBASTIAN) | Cod sursa (job #1259847)
#include <algorithm>
#include <cstdio>
#include <cstring>
#define MP make_pair
#define PB push_back
#define W 1001
using namespace std;
int c[W][W],f[W][W],i,n,m,t[W],q[W],p,u,nod,fluxminim,flow,x,y,cap;
inline bool BF()
{
memset(t,0,sizeof(t));
p=u=0;
q[p]=1;
while(p<=u)
{
nod=q[p];
for(i=1; i<=n; i++)
{
if(!t[i] && c[nod][i]>f[nod][i])
{
t[i]=nod;
q[++u]=i;
if(i==n) return 1;
}
}
p++;
}
return 0;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1; i<=m; i++)
{
scanf("%d %d %d",&x,&y,&cap);
c[x][y]=cap;
}
flow=0;
int l;
while( BF())
{ for(l=1;l<=n;l++)
{
if(t[l] && c[l][n]>f[l][n])
{ t[n]=l;
fluxminim=1000000000;
i=n;
while(i!=1)
{
if (fluxminim>c[t[i]][i]-f[t[i]][i]) {fluxminim=c[t[i]][i]-f[t[i]][i]; }
i=t[i];
}
i=n;
while(i!=1)
{
f[t[i]][i]+=fluxminim;
f[i][t[i]]-=fluxminim;
i=t[i];
}
flow+=fluxminim;
}
}
}
printf("%d\n",flow);
return 0;
}