Cod sursa(job #596077)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 15 iunie 2011 19:11:25
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>
#define INF 30001
#define N 355
int n,m,k,c[N][N],v[N][N],f[N][N],p,z,i,j,s,d,g[N][N],deg[N]={0};

long EK(int g[N][N],int c[N][N],int v[N][N],int n,int s,int d,int f[N][N],int deg[N])
{int pre[N],que[INF],p,q,t,i,l,m;
long e=0,a[N];
while(1)      
       {for(i=1;i<=n;i++)
               {pre[i]=-1;
               a[i]=INF;}
       a[s]=p=q=0;
       que[q++]=s;
       while(p<q)
               {t=que[p++];
               for(i=1;i<=deg[t];i++)
               if(a[g[t][i]]>a[t]+v[t][g[t][i]]&&c[t][g[t][i]]>f[t][g[t][i]])
                       {pre[que[q++]=g[t][i]]=t;
                       a[g[t][i]]=a[t]+v[t][g[t][i]];}}
       if(pre[d]<0)
               return e;
       m=INF;
       for(l=d;l!=s;l=pre[l])
       if(m>c[pre[l]][l]-f[pre[l]][l])
               m=c[pre[l]][l]-f[pre[l]][l];
       for(l=d;l!=s;l=pre[l])
               {f[pre[l]][l]+=m;
               f[l][pre[l]]-=m;}
       e=e+a[d]*m;}}
int main()
{freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
     c[i][j]=f[i][j]=0,v[i][j]=INF;
while(m--)
     {scanf("%d%d%d%d",&i,&j,&p,&z);
     deg[i]++;
     g[i][deg[i]]=j;
     c[i][j]=p;
     v[i][j]=z;
     v[j][i]=-z;}
printf("%ld",EK(g,c,v,n,s,d,f,deg));    
fclose(stdin);
fclose(stdout);
return 0;}