Cod sursa(job #908601)

Utilizator sebii_cSebastian Claici sebii_c Data 9 martie 2013 19:35:01
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <cstdio>

#include <queue>
#include <vector>

using namespace std;

const int MAXN = 351;
const int INF = 0x3f3f3f3f;

int N, M, S, D;
vector<int> G[MAXN];

int cap[MAXN][MAXN];
int cost[MAXN][MAXN];
int flow[MAXN][MAXN];

int d[MAXN];
int prev[MAXN];

bool found;

int bellman_ford()
{
    vector<bool> inqueue(N + 1, false);

    queue<int> q;
    q.push(S);
    inqueue[S] = true;

    for (int i = 1; i <= N; ++i) {
        prev[i] = -1;
        d[i] = INF;
    }
    d[S] = 0;

    while (!q.empty()) {
        int node = q.front();
        q.pop();
        inqueue[node] = false;

        vector<int>::iterator it;
        for (it = G[node].begin(); it != G[node].end(); ++it) {
            if (cap[node][*it] - flow[node][*it] <= 0)
                continue;
            if (cost[node][*it] + d[node] < d[*it]) {
                prev[*it] = node;
                d[*it] = cost[node][*it] + d[node];
                if (!inqueue[*it]) {
                    q.push(*it);
                    inqueue[*it] = true;
                }
            }
        }
    }

    if (d[D] < INF / 2) {
        found = true;

        int fmin = INF;
        for (int node = D; node != S; node = prev[node])
            fmin = min(fmin, cap[prev[node]][node] - flow[prev[node]][node]);
        for (int node = D; node != S; node = prev[node]) {
            flow[prev[node]][node] += fmin;
            flow[node][prev[node]] -= fmin;
        }

        return d[D] * fmin;
    } 

    return 0;
}

long long mfmc()
{
    long long result = 0;
    found = true;

    while (found) {
        found = false;
        result += bellman_ford();
    }

    return result;
}

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

    scanf("%d %d %d %d", &N, &M, &S, &D);
    for (int i = 0; i < M; ++i) {
        int x, y, c, z;
        scanf("%d %d %d %d", &x, &y, &c, &z);

        G[x].push_back(y);
        G[y].push_back(x);

        cap[x][y] = c;
        cost[x][y] = z;
        cost[y][x] = -z;
    }

    printf("%lld\n", mfmc());

    return 0;
}