Cod sursa(job #256345)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 11 februarie 2009 16:49:02
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>

#define IN "fmcm.in"
#define OUT "fmcm.out"
#define MAX 800000
#define MAX2 352
#define INF 2000000000

FILE *fin=fopen(IN,"r");
FILE * fout=fopen(OUT,"w");

int sol,s,n,m,d,u,w,*v,cp,cu,fl,cs,first,last;
int cm[MAX2],co[MAX],mark[MAX2],dad[MAX2],gr[MAX2];
int vec[MAX2][MAX2],c[MAX2][MAX2],C[MAX2][MAX2];

void citire();
void flux();

int main()
{
 citire();
  fclose(fin);
  
 flux();
 
 fprintf(fout,"%d\n",sol);
  fclose(fout);
  
 return 0;
}

void citire()
{
 int i;   
 v=new int;
 
 fscanf(fin,"%d%d%d%d",&n,&m,&s,&d);
 
 for(i=1;i<=m;i++)
 {
  fscanf(fin,"%d%d%d%d",&u,&w,&cp,&cs);
  c[u][w]=cp;
  C[u][w]=cs;
  C[w][u]=-cs;
  vec[u][gr[u]++]=w;
  vec[w][gr[w]++]=u;
 }
}

void flux()
{
 int i;
    
 for(;;)
 {
  for(i=1;i<=n;i++)
   cm[i]=INF;
   
  cm[s]=0;
  first=last=1;
  co[1]=s;
  mark[s]=1;
  
  while(first<=last)
  {
   u=co[first++];
   cu=cm[u];
   mark[u]=0;
   
   for(v=vec[u];*v;v++)
	if(c[u][*v]&&cu+C[u][*v]<cm[*v])
	{
	 cm[*v]=cu+C[u][*v];
	 dad[*v]=u;
	  if(!mark[*v])
	  {
       mark[*v]=1;
       co[++last]=*v;
      }
	}
  }
  if(cm[d]==INF)
   return;
   
  fl=INF;
  
  for(u=d;u!=s;u=dad[u])
   fl=(fl<c[dad[u]][u])?fl:c[dad[u]][u];
   
  for(u=d;u!=s;u=dad[u])
  {
   c[dad[u]][u]-=fl;
   c[u][dad[u]]+=fl;
  }
  sol+=fl*cm[d];
 }
}