Cod sursa(job #400207)

Utilizator miticaMitica mitica Data 21 februarie 2010 12:18:09
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
# include <stdio.h>
# define Nmax 1024
int n,m,viz[Nmax],T[Nmax],c[Nmax],f,Ct[Nmax][Nmax],F[Nmax][Nmax];
int sursa, dest;
int bf()
{
    int p,u,x,i;
    for(i=1;i<=n;++i)
	viz[i]=0;
    p=u=1; c[1]=sursa;
    while(p<=u)	{
	    x=c[p];
	    for(i=1;i<=n;++i)
		if(Ct[x][i]-F[x][i]>0 && viz[i]==0){
			c[++u]=i;
			viz[i]=1;
			T[i]=x;
		    }
	    p++;
	}
  return viz[dest];
}
int main()
{
    int x,y,c,min,i,j;
    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,&c);
	    Ct[x][y]=c;
	}
    sursa=1; dest=n;
    while(bf())

    for(i=1;i<=n;++i)
      if(Ct[i][n]-F[i][n]>0){
	    min=Ct[i][n]-F[i][n];
	    for(j=i;j!=1;j=T[j])
		if(Ct[T[j]][j]-F[T[j]][j]<min)
		    min=Ct[T[j]][j]-F[T[j]][j];
	    for(j=i;j!=1;j=T[j]){
		    F[T[j]][j]+=min;
		    F[j][T[j]]-=min;
		}
	    F[i][n]+=min;
	    F[n][i]-=min;
	    f+=min;
	}
    printf("%d\n",f);
    return 0;
}