Pagini recente » Cod sursa (job #2540773) | Cod sursa (job #2936534) | Cod sursa (job #517787) | Cod sursa (job #3002759) | Cod sursa (job #975429)
Cod sursa(job #975429)
#include <cstdio>
#define maxv 1001
#define min(x,y) ((x)<(y) ? (x):(y))
#define abs(x) ((x)>0 ? x: -x)
using namespace std;
int n,m,viz[maxv],q[maxv];
int c[maxv][maxv], f[maxv][maxv];
int bf()
{
int p,u,i,x;
q[0]=1; p=u=0; viz[1]=1;
while (p<=u && !viz[n])
{
x=q[p];
p++;
for (i=1;i<=n;i++)
if (!viz[i])
{
if(f[x][i]<c[x][i])
{
viz[i]=x;
u++;
q[u]=i;
}
else
if(f[i][x]>0)
{
viz[i]=-x;
u++;
q[u]=i;
}
}
}
return !viz[n];
}
void flux()
{
int i,a,b,lg,v;
int l[maxv];
do
{
for(i=1;i<=n;i++) viz[i]=0;
if (bf()) return;
l[0]=n;
lg=0;
a=b=1000000000;
while(l[lg]!=1)
{
lg++;
l[lg]=abs(viz[l[lg-1]]);
if (viz[l[lg-1]]>0)
a=min(a,c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
else if (viz[l[lg-1]]<0)
b=min(b,f[l[lg-1]][l[lg]]);
}
v=min(a,b);
for(i=lg;i>0;i--)
if(viz[l[i-1]]>0) f[l[i]][l[i-1]]+=v;
else f[l[i-1]][l[i]]-=v;
}
while (1);
}
void tipar()
{
int i,j,valflux=0;
// for(i=1;i<=n;i++)
// for(j=1;j<=n;j++)
// if (f[i][j]) printf("fluxul arcului (%d,%d)=%d\n",i,j,f[i][j]);
for(i=1;i<=n;i++) valflux+=f[i][n];
// printf("flux maxim=%d\n",valflux);
printf("%d\n",valflux);
}
int main()
{
int i,x,y,z;
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,&z);
c[x][y]=z;
}
flux();
tipar();
return 0;
}