Cod sursa(job #1158726)

Utilizator manutrutaEmanuel Truta manutruta Data 29 martie 2014 00:32:04
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>

using namespace std;
typedef vector<int>::iterator iter;

#define INF 0x3f3f3f3f
#define MAXN 355

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

int n, s, d;
int cap[MAXN][MAXN], fl[MAXN][MAXN], cost[MAXN][MAXN], t[MAXN];
vector<int> G[MAXN];
priority_queue< pair< int, pair<int, int> > > pq;
bitset<MAXN> viz;

bool dijkstra()
{
    viz.reset();
    pq.push(make_pair(0, make_pair(s, s)));

    while (!pq.empty()) {
        int dist = -pq.top().first;
        int tnd = pq.top().second.first;
        int nd = pq.top().second.second;
        pq.pop();

        if (viz[nd] == true) {
            continue;
        }
        viz[nd] = true;
        t[nd] = tnd;

        for (iter it = G[nd].begin(); it != G[nd].end(); it++) {
            if (viz[*it] == true || cap[nd][*it] == fl[nd][*it]) {
                continue;
            }

            pq.push(make_pair(-dist - cost[nd][*it], make_pair(nd, *it)));
        }
    }

    return viz[d];
}

int main()
{
    int m;
    f >> n >> m >> s >> d;
    for (int i = 1; i <= m; i++) {
        int x, y, c, z;
        f >> 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;
    }

    int sol = 0;
    while (dijkstra()) {
        for (iter it = G[d].begin(); it != G[d].end(); it++) {
            if (viz[*it] == false) {
                continue;
            }
            t[d] = *it;

            int fmin = INF;
            for (int i = d; i != s; i = t[i]) {
                fmin = min(fmin, cap[t[i]][i] - fl[t[i]][i]);
            }

            for (int i = d; i != s; i = t[i]) {
                fl[t[i]][i] += fmin;
                fl[i][t[i]] -= fmin;
                sol += fmin * cost[t[i]][i];
            }
        }
    }

    g << sol << '\n';

    f.close();
    g.close();
    return 0;
}