Cod sursa(job #520532)

Utilizator LuffyBanu Lavinia Luffy Data 9 ianuarie 2011 13:09:23
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<stdlib.h>
#define dim 1005
using namespace std;

int F[dim][dim],C[dim][dim],x,y,c,n,m,i,min,v[dim],viz[dim],fl;

void bfs()
{int i,j,p;
v[1]=1; viz[1]=1; i=1; j=1;

 while(i<=j && !viz[n])
{x=v[i];
  for(p=1;p<=n;p++)
   if(C[x][p]>F[x][p] && !viz[p])
    {j++; v[j]=p; viz[p]=x;}
   else if(F[p][x]>0 && !viz[p])
    {j++; v[j]=p; viz[p]=-x;}
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,&c);
  C[x][y]=c;}
 
 while(1)
{bfs();
 if(!viz[n]) break;
 
 min=99999999;
 for(i=n;i>1;i=abs(viz[i]))
  {x=abs(viz[i]);
	if(viz[i]>0)
	 {if(C[x][i]-F[x][i]<min) min=C[x][i]-F[x][i];}
	else
	 if(F[i][x]<min) min=F[i][x];
  }
  
for(i=n;i>1;i=abs(viz[i]))
 {x=abs(viz[i]);
  if(viz[i]>0) F[x][i]+=min;
  else F[i][x]-=min;}
 
 for(i=1;i<=n;i++) viz[i]=0;
}

for(i=1;i<=n;i++)
 fl+=F[1][i];

fprintf(g,"%d\n",fl);
 
 
fclose(f);
fclose(g);
return 0;
}