Cod sursa(job #2393104)

Utilizator ezioconnorVlad - Gabriel Iftimescu ezioconnor Data 30 martie 2019 20:18:26
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.7 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, s, d, cap[351][351], cost[351][351], f[351][351], p[351];
int vechi[351], nou[351], adev[351];
int MAX = INT_MIN, mmax, cmin;
bool inCoada[351];
vector <int> Muchii[351];

inline void bellmanFord()
{
    queue <int> coada;
    for (int i = 1; i <= n; ++i)
        vechi[i] = 5e8;
    vechi[s] = 0;
    coada.push(s);
    while (!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        inCoada[nod] = 0;
        for (int i = 0; i < Muchii[nod].size(); ++i)
        {
            int vecin = Muchii[nod][i];
            if (vechi[vecin] > vechi[nod] + cost[nod][vecin] && cap[nod][vecin])
            {
                vechi[vecin] = vechi[nod] + cost[nod][vecin];
                if (!inCoada[vecin])
                {
                    coada.push(vecin);
                    inCoada[vecin] = 1;
                }
            }
        }
    }
}

inline bool dijkstra()
{
    for (int i = 1; i <= n; ++i)
        nou[i] = adev[i] = 5e8;
    nou[s] = adev[s] = 0;
    priority_queue < pair <int, int> > coada;
    coada.push({0, s});
    while (!coada.empty())
    {
        pair <int, int> curr = coada.top();
        coada.pop();
        int nod = curr.second;
        if (nou[nod] != -curr.first)
            continue;
        for (int i = 0; i < Muchii[nod].size(); ++i)
        {
            int vecin = Muchii[nod][i];
            if (nou[nod] + cost[nod][vecin] + vechi[nod] - vechi[vecin] < nou[vecin] && f[nod][vecin] != cap[nod][vecin])
            {
                nou[vecin] = nou[nod] + cost[nod][vecin] + vechi[nod] - vechi[vecin];
                adev[vecin] = adev[nod] + cost[nod][vecin];
                p[vecin] = nod;
                coada.push({-nou[vecin], vecin});
            }
        }
    }
    return nou[d] != 5e8;
}

inline void citire()
{
    int x, y, c, z;
    in >> n >> m >> s >> d;
    for (int i = 1; i <= m; ++i)
    {
        in >> x >> y >> c >> z;
        Muchii[x].push_back(y);
        Muchii[y].push_back(x);
        cap[x][y] = c;
        cap[y][x] = 0;
        cost[x][y] = z;
        cost[y][x] = -z;
    }
}

int main()
{
    citire();
    bellmanFord();
    int rez = 0;
    while (dijkstra())
    {
        int MIN = 5e8;
        for (int i = d; i != s; i = p[i])
            MIN = min(MIN, cap[p[i]][i] - f[p[i]][i]);
        for (int i = d; i != s; i = p[i])
        {
            f[p[i]][i] += MIN;
            f[i][p[i]] -= MIN;
        }
        rez += (nou[d] + vechi[d]) * MIN;
        memcpy(vechi, adev, sizeof(adev));
    }
    out << rez;
    return 0;
}