Cod sursa(job #775437)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 8 august 2012 09:35:52
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.45 kb
#include<cstdio>
int z,y,n,m,k,j,i,l,s,d,t,q,r[351],c[351][351],p[351],h[351],g[351][351],a[351],o[351][351],b[351],e;
char w[50];
int main()
{freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
fgets(w,50,stdin);
for(j=0;w[j]!=' ';j++)
          n=n*10+(w[j]-'0');
for(j++;w[j]!=' ';j++)
          m=m*10+(w[j]-'0');
for(j++;w[j]!=' ';j++)
          s=s*10+(w[j]-'0');
for(j++;w[j]!='\n';j++)
          d=d*10+(w[j]-'0');
while(m--)
          {fgets(w,50,stdin),q=1,i=j=l=k=0;
          for(t=0;w[t]!=' ';t++)
                   i=i*10+(w[t]-'0');
          for(t++;w[t]!=' ';t++)
                   j=j*10+(w[t]-'0');
          for(t++;w[t]!=' ';t++)
                   l=l*10+(w[t]-'0');
          if(w[++t]=='-')
                   q=-1;
          else
                   k=w[t]-'0';
          for(t++;w[t]!='\n';t++)
                   k=k*10+(w[t]-'0');
          k=k*q,g[i][a[i]++]=j,g[j][a[j]++]=i,o[i][j]=k,o[j][i]=-k,c[i][j]=l;}
for(i=1;i<=n;i++)
          b[i]=10001;
b[s]=0;
for(i=1;i<=n&&!y;i++)
for(y=j=1;j<=n;j++)
for(k=0;k<a[j];k++)
if(c[j][g[j][k]]&&b[j]+o[j][g[j][k]]<b[g[j][k]])
          y=0,b[g[j][k]]=b[j]+o[j][g[j][k]];
for(z=b[d],i=1;i<=n;i++)
for(j=0;j<a[i];j++)
if(b[i]!=10001&&b[g[i][j]]!=10001)
          o[i][g[i][j]]+=b[i]-b[g[i][j]];
while(1)      
          {for(i=1;i<=n;i++)
                   b[i]=10001,r[i]=0;
          b[s]=p[d]=0,h[1]=s,l=1;
          while(l)
                   {i=h[1],r[i]=0,h[1]=h[l--],r[h[1]]=1;
                   for(j=1;(t=2*j)<=l;j=t)
                          {if(t<l&&b[h[t+1]]<b[h[t]])
                                 t++;
                          if(b[h[j]]<=b[h[t]])
                                 break;
                          h[j]^=h[t]^=h[j]^=h[t],r[h[t]]=t,r[h[j]]=j;}
                   for(k=0,j=g[i][0];k<a[i];j=g[i][++k])
                   if(b[j]>b[i]+o[i][j]&&c[i][j])
                          {b[j]=b[i]+o[i][j],p[j]=i;
                          if(!r[j])
                                 h[++l]=j,r[j]=l;
                          for(t=r[j];t>3&&b[h[t]]<b[h[t/2]];t/=2)
                                 h[t]^=h[t/2]^=h[t]^=h[t/2],r[h[t]]=t,r[h[t/2]]=t/2;}}
          if(!p[d])
                   break;
          for(m=10001,l=d;l!=s;l=p[l])
          if(m>c[p[l]][l])
                   m=c[p[l]][l];
          for(l=d;l!=s;l=p[l])
                   c[p[l]][l]-=m,c[l][p[l]]+=m;
          e=e+(b[d]+z)*m;}
printf("%d",e);
return 0;}