Cod sursa(job #266168)

Utilizator crawlerPuni Andrei Paul crawler Data 24 februarie 2009 22:46:15
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>

#define Inf 1000000000
#define Nmax 351
#define Qmax 512
#define Mod &(Qmax-1)

int C[Nmax][Nmax], P[Nmax][Nmax], F[Nmax][Nmax], v[Nmax], t[Nmax], dm[Nmax], s,d,m,n, q[Qmax];
long long COST;

int BF()
{
     for (int i=1;i<=n;++i)
          dm[i] = Inf, 
          v[i] = 0;
     int st=0,dr=1, nod;
     q[1] = s;
     dm[s] = 0;
     v[s] = 1;
     while (st<dr)
     {
          nod = q[(++st)Mod];
          v[nod] = 0;
          for (int i=1;i<=n;++i) if ((v[i] == 0) && (C[nod][i] - F[nod][i] > 0) && (dm[nod] + P[nod][i] < dm[i]))
          {
               dm[i] = dm[nod] + P[nod][i];
               v[i] = 1;
               t[i] = nod;
               q[(++dr)Mod] = i;     
          }
     }
     return (dm[d]<Inf/2)?1:0;
}

int main()
{
     freopen("fmcm.in","r",stdin);
     freopen("fmcm.out","w",stdout);
     
     scanf("%d%d%d%d", &n,&m,&s,&d);

     int x,y,z,c;
     
     for (int i=1;i<=m;++i)
     {
          scanf("%d%d%d%d", &x,&y,&c,&z);
          C[x][y] = c;
          P[x][y] = z;
          P[y][x] = -z;         
     }
     
     while (BF())
     {
          int r = C[t[d]][d]-F[t[d]][d];
          for (int i=d;i!=s;i=t[i])     
               if (C[t[i]][i]-F[t[i]][i] < r) 
                    r = C[t[i]][i] - F[t[i]][i];
          for (int i=d;i!=s;i=t[i])     
               F[t[i]][i] += r,
               F[i][t[i]] -= r;
          COST += r*dm[d];
     }
     
     printf("%lld\n", COST);
     
     return 0;     
}