Cod sursa(job #1409497)

Utilizator retrogradLucian Bicsi retrograd Data 30 martie 2015 15:58:52
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include<fstream>
#include<vector>
#include<queue>

using namespace std;
typedef int var;

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

struct Edge {
    var node, f, c, k, vec;
    var rev;
    Edge (var t, var a, var c, var d, var r) {
        node = t;
        vec = a;
        f = 0;
        this->c = c;
        k = d;
        rev = r;
    }
    Edge () {}
};

vector<Edge> Edges(1);

#define MAXN 1000
#define INF (1 << 30)

vector<pair<var, var> > G[MAXN];
var n;
bool INQ[MAXN];
var DI[MAXN];
var PE[MAXN], PN[MAXN];
var S, D;
queue<var> Q;

bool bellman() {
    for(var i=1; i<=n; i++) {
        DI[i] = INF;
        PN[i] = 0;
        PE[i] = 0;
    }
    DI[S] = 0;
    Q.push(S);

    while(!Q.empty()) {
        var node = Q.front();
        Q.pop();
        INQ[node] = 0;

        for(auto &p : G[node]) {
            var vec = p.first;
            Edge &e = Edges[p.second];

            if(e.c > e.f && DI[vec] > DI[node] + e.k) {
                DI[vec] = DI[node] + e.k;
                PE[vec] = p.second;
                PN[vec] = node;
                if(!INQ[vec]) {
                    Q.push(vec);
                    INQ[vec] = 1;
                }
            }
        }

    }

    return PE[D] != 0;
}

var mfmc() {
    var total = 0;

    while(bellman()) {
        var M = INF;
        for(var node = D; node != S; node = PN[node]) {
            Edge &e = Edges[PE[node]];
            M = min(M, e.c - e.f);
        }

        for(var node = D; node != S; node = PN[node]) {
            Edge &e = Edges[PE[node]];
            e.f += M;
            Edges[e.rev].f -= M;
            total += e.k * M;
        }
    }

    return total;
}


void addEdge(var a, var b, var cap, var cost) {

    var i = Edges.size();
    Edges.push_back(Edge(a, b, cap, cost, i+1));
    Edges.push_back(Edge(b, a, 0, -cost, i));
    G[a].push_back(make_pair(b, i));
    G[b].push_back(make_pair(a, i+1));

}

int main() {
    var m, a, b, c, k;

    fin>>n>>m>>S>>D;

    while(m--) {
        fin>>a>>b>>c>>k;
        addEdge(a, b, c, k);
    }

    fout<<mfmc();
}