Cod sursa(job #600020)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 30 iunie 2011 12:18:02
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>
#include<string.h>
#define INF 30001
#define N 351
int n,m,k,c[N][N],v[N][N],f[N][N],p,z,i,j,s,d,pre[N],que[INF],q,t,l,a[N];
long e=0;
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,v[j][i]=-z;}
while(1)      
       {memset(pre,0,sizeof(pre)),memset(a,INF,sizeof(a));
       m=INF,a[s]=p=q=0,que[q++]=s;
       while(p<q)
               {t=que[p++];
               for(i=1;i<=n;i++)
               if(f[t][i]<c[t][i]&&a[i]>a[t]+v[t][i])
                       que[q++]=i,pre[i]=t,a[i]=a[t]+v[t][i];}
       if(!pre[d])
               break;
       for(l=d;l!=s;l=pre[l])
       if(m>(t=c[pre[l]][l]-f[pre[l]][l]))
               m=t;
       for(l=d;l!=s;l=pre[l])
               f[pre[l]][l]+=m,f[l][pre[l]]-=m;
       e+=a[d]*m;}
printf("%ld",e);    
fclose(stdin);
fclose(stdout);
return 0;}