Cod sursa(job #287449)
Utilizator | Data | 24 martie 2009 21:18:36 | |
---|---|---|---|
Problema | Flux maxim | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.68 kb |
#include<stdio.h>
#define NMAX 1001
int a[NMAX][NMAX],f[NMAX][NMAX];
struct coada{int nod,tata;}c[1000001];
int p,i,j,u,tz,nod,n,m,t,minim,fluxMaxim;
int main(void)
{
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",&t,&p,&u);
a[t][p]=u;
}
p=u=1;
c[p].nod=1;
c[p].tata=0;
while(p<=u)
{
nod=c[p].nod;
for(i=1;i<=n;i++)
{
if(i!=c[c[p].tata].nod&&((a[nod][i]>f[nod][i])||(f[i][nod]>0)))
{
//if(i==2&&nod==)
u++;
c[u].nod=i;
c[u].tata=p;
//printf("%d ",i);
/*
t=u;
while(c[t].tata!=0)
{
printf("(%d,%d) ",c[c[t].tata].nod,c[t].nod);
t=c[t].tata;
}
printf("\n"); */
if(i==n)
{
// printf("Am ajuns in 7 baaaa !");
t=u;
minim=1200000;
while(c[t].tata!=0)
{
if(a[c[c[t].tata].nod][c[t].nod]>0)
{
tz=a[c[c[t].tata].nod][c[t].nod]-f[c[c[t].tata].nod][c[t].nod];
// if(tz==0)
// printf("muchie pozitiva : %d -> %d ",c[c[t].tata].nod, c[t].nod);
}
else if(a[c[t].nod][c[c[t].tata].nod]>0)
{
tz=f[c[t].nod][c[c[t].tata].nod];
/* if(tz==0)
printf("muchie negativa : %d -> %d ",c[t].nod,c[c[t].tata].nod);
*/
}
if(minim>tz)
{
minim=tz;
}
t=c[t].tata;
}
if(minim>0)
{
fluxMaxim+=minim;
//printf(" MINIM : %d \n ",minim);
t=u;
while(c[t].tata!=0)
{
if(a[c[c[t].tata].nod][c[t].nod]>0)
{
f[c[c[t].tata].nod][c[t].nod]+=minim;
}
else if(a[c[t].nod][c[c[t].tata].nod]>0)
{
f[c[t].nod][c[c[t].tata].nod]-=minim;
}
//printf("(%d,%d) ",c[t].nod,c[c[t].tata].nod);
t=c[t].tata;
}
//printf("\n");
/*
for(j=1;j<=n;j++)
{
printf("%d ",viz[j]);
}
printf("\n"); */
}
break;
}
}
}
p++;
} /*
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ",f[i][j]);
}
printf("\n");
} */
printf("%d\n",fluxMaxim);
fclose(stdin);
fclose(stdout);
return 0;
}