Cod sursa(job #1155462)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 26 martie 2014 22:17:43
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
#define NMax 355
using namespace std;

int d[NMax],old_d[NMax];
int real_d[NMax],N,M;
int inQ[NMax],tata[NMax],S,D;
int C[NMax][NMax],Cst[NMax][NMax];

priority_queue<pair<int,int>,
               vector<pair<int,int> >,
               greater<pair<int,int> > > H;
queue<int> Q;
vector<int> V[NMax];

void bellmanFord ()
{
    memset(old_d,inf,sizeof(old_d));
    old_d[S]=0;
    Q.push(S), inQ[S]=1;
    while (!Q.empty())
    {
        int crt=Q.front();
        inQ[crt]=0, Q.pop();
        vector<int>::iterator it;
        for (it=V[crt].begin(); it!=V[crt].end(); ++it)
            if (C[crt][*it] && old_d[*it]>old_d[crt]+Cst[crt][*it])
            {
                old_d[*it]=old_d[crt]+Cst[crt][*it];
                if (!inQ[*it])
                    inQ[*it]=1, Q.push(*it);
            }
    }
}

int dijkstra ()
{
    memset(d,inf,sizeof(d));
    H=priority_queue<pair<int,int>,
               vector<pair<int,int> >,
               greater<pair<int,int> > >();
    d[S]=0, real_d[S]=0;
    H.push(make_pair(0,S));
    while (!H.empty())
    {
        int crt=H.top().second;
        H.pop();
        vector<int>::iterator it;
        for (it=V[crt].begin(); it!=V[crt].end(); ++it)
            if (C[crt][*it])
            {
                int new_d=d[crt]+Cst[crt][*it]-old_d[*it]+old_d[crt];
                if (new_d<d[*it])
                {
                    d[*it]=new_d;
                    real_d[*it]=real_d[crt]+Cst[crt][*it];
                    tata[*it]=crt;
                    H.push(make_pair(d[*it],*it));
                }
            }
    }
    memcpy(old_d,real_d,sizeof(d));
    return (d[D]!=inf);
}

int main ()
{
    int minF,FCost=0,i,x,y,crt;
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&N,&M,&S,&D);
    for (i=1; i<=M; i++)
    {
        scanf("%d%d",&x,&y);
        V[x].push_back(y);
        V[y].push_back(x);
        scanf("%d%d",&C[x][y],&Cst[x][y]);
        Cst[y][x]=-Cst[x][y];
    }
    bellmanFord();
    while (dijkstra())
    {
        minF=inf;
        for (crt=D; crt!=S; crt=tata[crt])
            if (C[tata[crt]][crt]<minF)
                minF=C[tata[crt]][crt];
        FCost+=minF*real_d[D];
        for (crt=D; crt!=S; crt=tata[crt])
        {
            C[tata[crt]][crt]-=minF;
            C[crt][tata[crt]]+=minF;
        }
    }
    printf("%d\n",FCost);
    return 0;
}