Cod sursa(job #357368)

Utilizator crawlerPuni Andrei Paul crawler Data 19 octombrie 2009 00:07:11
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

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

int C[Nmax][Nmax], P[Nmax][Nmax], F[Nmax][Nmax], t[Nmax], s,d,m,n, dmd;
long long COST;

vector <int> l[Nmax];

inline int BF()
{
     int q[Qmax], v[Nmax], dm[Nmax];
     
     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];
          for (int j=0;j<(int)l[nod].size();++j)
          {
               #define i l[nod][j]
               if ((dm[nod] + P[nod][i] < dm[i])&&(C[nod][i] - F[nod][i] > 0))
               {
                    dm[i] = dm[nod] + P[nod][i];
                    t[i] = nod;
                    if (v[i] == 0)
                    {
                         q[(++dr)Mod] = i;
                         v[i] = 1;
                    }
               }
               #undef i
          }
          v[nod] = 0;
     }
     dmd = dm[d];
     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);
          l[x].push_back(y);
          l[y].push_back(x);
          C[x][y] = c;
          P[x][y] = z;
          P[y][x] = -z;
     }
     
     for (int i=1;i<=n;++i)
          sort(l[i].begin(),l[i].end());

     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*dmd;
     }

     printf("%lld\n", COST);

     return 0;
}