Cod sursa(job #1158962)

Utilizator manutrutaEmanuel Truta manutruta Data 29 martie 2014 11:04:49
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include <cstdlib>
#include <cstring>
#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], dist[MAXN], viz[MAXN];
vector<int> G[MAXN];
queue< pair<int, int> > q;
bitset<MAXN> vizmuchie[MAXN];

bool dijkstra()
{
    while (!q.empty()) q.pop();
    for (int i = 1; i <= n; i++) viz[i] = 0;
    memset(dist, 0x3f, sizeof(dist));
    q.push(make_pair(s, s));
    dist[s] = 0;

    while (!q.empty()) {
        int tnd = q.front().first;
        int nd = q.front().second;
        q.pop();

        viz[nd]++;
        if (viz[nd] > n) {
            break;
        }

        if (dist[tnd] + cost[tnd][nd] == dist[nd]) {
            t[nd] = tnd;
        }

        if (nd == d) {
            //cout << "!!!\n\n";
            system("pause");
            continue;
        }

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

            dist[*it] = dist[nd] + cost[nd][*it];
            q.push(make_pair(nd, *it));
        }

        /*for (int i = 1; i <= n; i++) {
            cout << dist[i] << ' ';
        }
        cout << endl << endl;*/
        system("pause");
    }
    //cout << endl;

    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;
    }

    /*for (int i = 1; i <= n; i++) {
        cout << i << ": ";
        for (iter it = G[i].begin(); it != G[i].end(); it++) {
            cout << *it << ' ';
        }
        cout << endl;
    }
    cout << endl;*/

    int sol = 0;
    while (dijkstra) {
        /*for (int i = d; i != s; i = t[i]) {
            cout << i << ' ';
        }
        cout << s << " -> ";*/

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

        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;
}