Cod sursa(job #420763)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 20 martie 2010 15:10:08
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>
FILE *f,*g;
long a[1001][1001],c[1001],i,n,m,x,y,z,min,parinte[1001],flux,u,p,viz[1001],ind,v[1001],k;
int bf()
{ u=p=1; c[1]=1; viz[1]=ind; k=0;
  while(p<=u)
   { for(i=1;i<=n;i++) if(a[c[p]][i]&&viz[i]!=ind) 
       if(i!=n) { u++; c[u]=i; viz[i]=ind; parinte[i]=c[p]; }
	   else {k++; v[k]=c[p]; } 
     p++;
   }
  return k;
}
int main()
{ f=fopen("maxflow.in","r"); g=fopen("maxflow.out","w");
  fscanf(f,"%ld%ld",&n,&m);
  for(i=1;i<=m;i++) { fscanf(f,"%ld%ld%ld",&x,&y,&z); a[x][y]=z; }
  ind=1;
  while(bf())
   { for(i=1;i<=k;i++) { parinte[n]=v[i]; 
	 x=n; min=1000000;
     while(x!=1)
	  { if(a[parinte[x]][x]<min) min=a[parinte[x]][x];
	    x=parinte[x];
	  }
	 x=n;
	 while(x!=1)
	  { a[parinte[x]][x]-=min; a[x][parinte[x]]+=min;
        x=parinte[x];
      }
	 flux+=min; } ind++; parinte[n]=0; 
   }
  fprintf(g,"%ld",flux);
  fclose(g);
  return 0;
}