Cod sursa(job #519906)

Utilizator LuffyBanu Lavinia Luffy Data 6 ianuarie 2011 21:17:19
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<stdio.h>
#define dim 1005
using namespace std;

int c[dim][dim],fl[dim][dim],marc[dim],p,poz[dim],v[dim],n,x,m,i,y,a,flux;



void bk()
{int i,j,x,k;
	v[1]=1; //marc[1]=1; 
	i=1; j=1;

 while(i<=j && !marc[n])
 {x=v[i];
   for(k=1;k<=n;k++)
    if(c[x][k]>fl[x][k] && !marc[k])
	 {j++; v[j]=k; marc[k]=x; poz[j]=i;}
  i++;
 }
p=j;	
}

void ek()
{int i,min=56895889;
i=p;
 while(poz[i]>0)
 {x=c[marc[v[i]]][v[i]]-fl[marc[v[i]]][v[i]];
  if(x<min) min=x;
 i=poz[i];}
 
i=p;
   while(poz[i]>0)
 {fl[marc[v[i]]][v[i]]+=min;
   i=poz[i];}

}


int main()
{
 FILE *f=fopen("maxflow.in","r"), *g=fopen("maxflow.out","w");

fscanf(f,"%d%d",&n,&m);
 for(i=1;i<=m;i++)
  {fscanf(f,"%d%d%d",&x,&y,&a); c[x][y]=a;}
 
while(1)
{bk();
if(marc[n]==0) break;
ek();

for(i=1;i<=n;i++) {marc[i]=0; poz[i]=0;}
}
 
for(i=1;i<=n;i++) flux+=fl[1][i];
fprintf(g,"%d\n",flux);
 
fclose(f);
fclose(g);
return 0;
}