Cod sursa(job #1206794)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 11 iulie 2014 11:40:09
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIMN 351
#define INF 1000000000

using namespace std;

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

vector<int> L[DIMN];

int C[DIMN][DIMN], F[DIMN][DIMN], D[DIMN], cost[DIMN][DIMN], T[DIMN];

int q[DIMN];

int n,m,s,d,p,u,x,y,c,z;

bool ok, viz[DIMN];

int BF() {
    queue<int> q;
    for (int i=1; i<=n; ++i) {
        D[i] = INF;
        viz[i] = 0;
    }
    p = u = 1;
    q.push(s);
    D[s] = 0;
    viz[s] = 1;
    while (!q.empty()) {
        int nod = q.front();
        q.pop();
        viz[nod] = 0;
        for (vector<int>::iterator it=L[nod].begin(); it!=L[nod].end(); it++)
            if (C[nod][*it] - F[nod][*it] > 0 && D[*it] > D[nod] + cost[nod][*it]) {
                D[*it] = D[nod] + cost[nod][*it];
                if (!viz[*it]) {
                    viz[*it] = 1;
                    q.push(*it);
                }
                T[*it] = nod;
            }
    }
    if (D[d] != INF) {
        ok = 1;
        int Min = INF;
        for (int i=d; i!=s; i=T[i])
            Min = min(Min, C[T[i]][i] - F[T[i]][i]);
        for (int i=d; i!=s; i=T[i]) {
            F[T[i]][i] += Min;
            F[i][T[i]] -= Min;
        }
        return Min * D[d];
    }
    return 0;
}

int main() {
    f >> n >> m >> s >> d;
    for (int i=1; i<=m; ++i) {
        f >> x >> y >> c >> z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y] = c;
        cost[x][y] = z;
        cost[y][x] = -z;
    }
    int ans = 0;
    ok = 1;
    while (ok) {
        ok = 0;
        ans += BF();
    }
    g << ans << "\n";
    return 0;
}