Cod sursa(job #280979)

Utilizator petrecgClinciu Glisca Petre petrecg Data 13 martie 2009 18:17:52
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>   
#include <string.h>
#define inf 2000000000
long t,p,u,s,d,i,n,parinte[1001],c[51][51],m,x,y,z,fluxm,min,dist[1001],cost[51][51];
int bf()   
{ long i,j,k;for(i=1;i<=n;i++)
   {dist[i]=inf;parinte[i]=0;}
  dist[s]=0;
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
    for(k=1;k<=n;k++)
     if(c[j][k]&&dist[k]>dist[j]+cost[j][k]&&dist[j]<inf)
      {dist[k]=dist[j]+cost[j][k];
       parinte[k]=j;
      }
 if(parinte[d])return 1;else return 0;
}

int main()
{ freopen("fmcm.in","r",stdin); freopen("fmcm.out","w",stdout);
  scanf("%ld%ld%ld%ld",&n,&m,&s,&d);
  for(i=1;i<=m;i++)
   { scanf("%ld%ld%ld%ld",&x,&y,&z,&t);
     c[x][y]=z;cost[x][y]=t;cost[y][x]=-t;
   }
  while(bf())
   {for(i=1;i<=n;i++)
    {
     if(parinte[i]<=0||c[i][n]<=0||cost[i][d]+dist[i]>dist[d])continue;
     min=c[i][d]; x=i;
     while(parinte[x])
      { if(c[parinte[x]][x]<min) min=c[parinte[x]][x];
     x=parinte[x];
      }
     x=i;fluxm+=min*dist[d];c[i][d]-=min;c[d][i]+=min;
     while(parinte[x])
      { c[parinte[x]][x]-=min;
    c[x][parinte[x]]+=min;
    x=parinte[x];
      }

    }
    memset(parinte,0,sizeof(parinte));
   }
 printf("%ld",fluxm);
 fclose(stdout);   
 return 0;   
}