Cod sursa(job #604225)
Utilizator | Data | 21 iulie 2011 09:31:54 | |
---|---|---|---|
Problema | Flux maxim de cost minim | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.03 kb |
#include<stdio.h>
#define N 350
#define X(a,b) a^=b^=a^=b
int n,m,k,c[N][N],f[N][N],i,s,d,p[N],t,l,h[N],r[N],j,g[N][N],a[N],o[N][N],b[N];
long e;
int main()
{freopen("fmcm.in","r",stdin),freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d),s--,d--;
while(m--)
scanf("%d%d%d%d",&i,&j,&l,&k),i--,j--,o[i][g[i][a[i]++]=j]=k,o[j][g[j][a[j]++]=i]=-k,c[i][j]=l;
while(1)
{for(i=0;i<n;i++)
r[i]=-1,b[i]=10001;
b[s]=l=0,m=10001,h[l++]=s,p[d]=-1;
while(l)
{r[i=h[0]]=-1,r[h[0]=h[--l]]=j=0;
while(j<l)
{k=j;
if((j<<1)<l)
{k=j<<1;
if(k+1<l&&b[h[k+1]]<b[h[k]])
k++;}
else
break;
if(b[h[j]]>b[h[k]])
X(h[j],h[k]),r[h[j]]=j,r[h[k]]=k,j=k;
else
break;}
for(k=0;k<a[i];k++)
if(c[i][g[i][k]]>f[i][g[i][k]]&&b[g[i][k]]>b[i]+o[i][g[i][k]])
{b[g[i][k]]=b[i]+o[i][g[i][k]],p[g[i][k]]=i;
if(r[g[i][k]]<0)
j=r[g[i][k]]=l,h[l++]=g[i][k];
else
j=r[g[i][k]];
while(j)
{t=j>>1;
if(b[h[t]]>b[h[j]])
X(h[j],h[t]),r[h[j]]=j,r[h[t]]=t,j=t;
else
j=0;}}}
if(p[d]<0)
break;
for(l=d;l!=s;l=p[l])
if(m>(t=c[p[l]][l]-f[p[l]][l]))
m=t;
for(l=d;l!=s;l=p[l])
f[p[l]][l]+=m,f[l][p[l]]-=m;
e+=b[d]*m;}
printf("%ld",e);
return 0;}