Cod sursa(job #933063)

Utilizator Bogdan13Bogdan Stoian Bogdan13 Data 29 martie 2013 16:06:49
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#include<algorithm>
#define NMAX 355
#define INF 1999999999
using namespace std;

ifstream f("fmcm.in");
ofstream g("fmcm.out");

int N,M,S,D , C[NMAX][NMAX], F[NMAX][NMAX], dst[NMAX], cst[NMAX][NMAX],T[NMAX],afis;

struct cmp{
    bool operator () (int x,int y)
    {
        return dst[x]>dst[y];
    }
         };

vector<int>L[NMAX];
priority_queue<int,vector<int>,cmp>q;

int drum()
{
    for (int i=1;i<=N;i++) dst[i]=INF;
    dst[S]=0;
    q.push(S);

    int nod=0,ad=0;

    while ( !q.empty() )
    {
      nod=q.top();
      q.pop();


      for (int i=0;i<L[nod].size();i++)
      {
          ad=L[nod][i];

          if (C[nod][ad]-F[nod][ad]<=0) continue;

          if (dst[ad]>dst[nod]+cst[nod][ad] )
          {dst[ad]=dst[nod]+cst[nod][ad];
           T[ad]=nod;



           q.push(ad);

          }
      }
    }
    if (dst[D]==INF) return 0;

return 1;
}


int main()
{
    f>>N>>M>>S>>D;

    int x,y,c,z;

    for (int i=1;i<=M;i++)
    {
        f>>x>>y>>c>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]=c;
        cst[x][y]=z;
        cst[y][x]=-z;
    }

int fmin;
    while ( drum() )
{
    fmin=INF;
    for (int i=D;i!=S;i=T[i])
        fmin=min(fmin,C[T[i]][i]-F[T[i]][i]);
    for (int i=D;i!=S;i=T[i])
        {
            F[T[i]][i] += fmin;
            F[i][ T[i] ] -= fmin;
        }
    afis+=dst[D]*fmin;

}
g<<afis;
return 0;
}