Cod sursa(job #594557)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 8 iunie 2011 11:49:32
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>
#define INF 10000
#define N 351
int n,m,s,d,c[N][N],f[N][N]={0},i,z,p,j,v[N][N];

long ek(int c[N][N],int f[N][N],int s,int d,int n,int v[N][N])
{int i,lg,l[N],u,x,q[N],p,viz[N],g,b;
long e=0,a[N];
do
      {for(i=1;i<=n;i++)
             {viz[i]=0;
             a[i]=INF;}
      a[s]=p=u=lg=0;
      q[0]=s;
      while(p<=u)
             {x=q[p++];
             for(i=1;i<=n;i++)
             if(f[x][i]<c[x][i]&&a[i]>a[x]+v[x][i])
                     {viz[i]=x;
                     a[i]=a[x]+v[x][i];
                     q[++u]=i;}}
      if(!viz[d])
             return e;
      l[0]=d;
      g=INF;
      while(l[lg]!=s)
             {lg++;
             l[lg]=viz[l[lg-1]];
             if(g>(b=c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]))
                     g=b;}
      e=e+g*a[d];
      for(i=lg;i>0;i--)
             f[l[i]][l[i-1]]+=g;}
while(1);}

int main()
{freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d);
while(m--)
      {scanf("%d%d%d%d",&i,&j,&p,&z);
      c[i][j]=p;
      v[i][j]=z;}
printf("%ld",ek(c,f,s,d,n,v));
fclose(stdin);
fclose(stdout);
return 0;}