Cod sursa(job #2475366)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 16 octombrie 2019 20:10:20
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f

using namespace std;

int cost[360][360];
int cap[360][360];
int apa[360][360];
int n, m, s, d;
vector<int> g[360];

int inQueue[360];
int dist[360];
int tata[360];

int costTotal = 0;

bool bellman()
{
    queue<int> q;
    memset(inQueue, 0, sizeof(inQueue));
    memset(dist, 0x3f, sizeof(dist));
    tata[s] = -1;
    dist[s] = 0;
    inQueue[s] = 1;
    q.push(s);
    while(!q.empty())
    {
        int nod = q.front();
        q.pop();
        inQueue[nod] = 0;
        for(int vnod : g[nod])
        {
            if(apa[nod][vnod] < cap[nod][vnod] && dist[vnod] > dist[nod] + cost[nod][vnod])
            {
                dist[vnod] = dist[nod] + cost[nod][vnod];
                tata[vnod] = nod;
                if(inQueue[vnod] == 0)
                {
                    inQueue[vnod] = 1;
                    q.push(vnod);
                }
            }
        }
    }
    if(dist[d] == inf)
        return false;
    int capmin = inf;
    for(int t = d; tata[t] != -1; t = tata[t])
    {
        capmin = min(capmin, cap[tata[t]][t] - apa[tata[t]][t]);
    }
    for(int t = d; tata[t] != -1; t = tata[t])
    {
        costTotal += capmin * cost[tata[t]][t];
        apa[tata[t]][t] += capmin;
        apa[t][tata[t]] -= capmin;
    }
    return true;
}

int main() {
    freopen("fmcm.in", "r", stdin);
    freopen("fmcm.out", "w", stdout);

    cin >> n >> m >> s >> d;
    for(int i = 0; i < m; i++)
    {
        int a, b, c, z;
        cin >> a >> b >> c >> z;
        cost[a][b] = z;
        cost[b][a] = -z;
        cap[a][b] = c;
        cap[b][a] = 0;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    while(bellman());

    cout << costTotal;

    return 0;
}