Cod sursa(job #1962418)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 11 aprilie 2017 19:03:22
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

vector <int> G[351];
vector <int> ::iterator IT;
queue <int> bf;
priority_queue<pair<int,int> > dj;

int mCost[351][351],mCapacitate[351][351],vDist[351],vDistN[351],vTati[351],vDistR[351];
int n,m,s,d;
int F,Fcst;

void citire()
{
    scanf("%d%d%d%d",&n,&m,&s,&d);
    int x,y,cost,capacitate;
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d%d",&x,&y,&capacitate,&cost);
        G[x].push_back(y);
        G[y].push_back(x);
        mCost[x][y]=cost;
        mCost[y][x]=-cost;
        mCapacitate[x][y]=capacitate;
        mCapacitate[y][x]=0;
    }
}
void init(int lungime, int vect[],int val)
{
    for(int i=1; i<=lungime; i++)
        vect[i]=val;
}
bool belmanford()
{
    init(n,vDist,0x3f3f3f3f);

    vDist[s]=0;
    bf.push(s);
    int nod;
    while(!bf.empty())
    {
        nod=bf.front();
        bf.pop();
        for(IT=G[nod].begin(); IT!=G[nod].end(); IT++)
            if(vDist[*IT]>vDist[nod]+mCost[nod][*IT])
            {
                vDist[*IT]=vDist[nod]+mCost[nod][*IT];
                bf.push(*IT);
            }
    }
    if(vDist[d]==0x3f3f3f3f)
        return false;
    return true;
}

bool dijkstra()
{
    init(n,vDistN,0x3f3f3f3f);

    vDistN[s]=0;
    dj.push(make_pair(0,s));
    int nod,dist,new_D;
    while(!dj.empty())
    {
        nod=dj.top().second;
        dist=-dj.top().first;
        if(vDistN[nod]!=dist)
            continue;

        for(IT=G[nod].begin(); IT!=G[nod].end(); IT++)
            if(mCapacitate[nod][*IT])
            {
                new_D=vDistN[nod]+vDist[nod]+mCost[nod][*IT]-vDist[*IT];
                if(vDistN[*IT]>new_D)
                {
                    vDistN[*IT]=new_D;
                    vTati[*IT]=nod;
                    vDistR[*IT]=vDistR[nod]+mCost[nod][*IT];
                    dj.push(make_pair(-vDistN[*IT],*IT));
                }

            }
    }

    for(int i=1;i<=n;i++)
        vDistR[i]=vDist[i];

    if(vDistN[d]==0x3f3f3f3f)
        return false;

    int minim=0x3f3f3f3f, costCurent=0;
    for(int aux=d; aux!=s; aux=vTati[aux])
    {
        minim=min(minim,mCapacitate[vTati[aux]][aux]);
        costCurent+=mCost[vTati[aux]][aux];
    }
    F+=minim;
    Fcst+=minim*vDistR[d];

    for(int aux=d; aux!=s; aux=vTati[aux])
    {
        mCapacitate[vTati[aux]][aux]-=minim;
        mCapacitate[aux][vTati[aux]]+=minim;
    }
    return true;
}


int main()
{
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    citire();
    F=Fcst=0;
    belmanford();
    while(dijkstra());
    printf("%d",Fcst);
    return 0;
}