Cod sursa(job #2194789)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 14 aprilie 2018 13:18:59
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("fmcm.in");
ofstream out ("fmcm.out");
int total,n,m,s,d,a,b,e,coada[351*351],tata[351],hz[351],cap[351][351],f,c[351],flux[351][351],cost[351][351],st,dr;
vector<int>v[351];
bool bellmanford (int s, int d) {
    coada[1] = s;
    for (int i = 1; i <= n; i ++) {
        c[i] = 0;
        hz[i] = 0;
        tata[i] = 0;
    }
    c[s] = 1;
    hz[s] = 1;
    for (st = 1, dr = 1; st <= dr; st ++) {
        int a = coada[st];
        for (int i = 0; i < v[a].size(); i ++) {
            int b = v[a][i];
            if (flux[a][b] < cap[a][b] && (c[b] > c[a] + cost[a][b] || tata[b] == 0)) {
                if (hz[b] == 0) {
                    hz[b] = 1;
                    dr ++;
                    coada[dr] = b;
                    c[b] = c[a] + cost[a][b];
                }
                else {
                    c[b] = c[a] + cost[a][b];
                }
                tata[b] = a;
            }
        }
        hz[a] = 0;
    }
    if (tata[d] != 0) {
        return 1;
    }
    return 0;
}
int main (void) {
    in >> n >> m >> s >> d;
    for (int i = 1; i <= m; i ++) {
        in >> a >> b >> f >> e;
        v[a].push_back (b);
        v[b].push_back (a);
        cap[a][b] = f;
        cost[a][b] = e;
        cap[b][a] = 0;
        cost[b][a] = -e;
    }

    while (bellmanford(s,d)) {
        int x = d,minim = 1e9;
        while (x != s) {
            b = x;
            a = tata[x];
            minim = min (cap[a][b] - flux[a][b], minim);
            x = tata[x];
        }

        x = d;
        while (x != s) {
            b = x;
            a = tata[x];
            flux[a][b] += minim;
            flux[b][a] -= minim;
            total += minim * (cost[a][b]);
            x = tata[x];
        }
    }
    out << total;
    return 0;
}