Cod sursa(job #2247560)

Utilizator Menage_a_011UPB Cheseli Neatu Popescu Menage_a_011 Data 28 septembrie 2018 19:42:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <bits/stdc++.h>
using namespace std;

#define USE_FILES "MLC"

#ifdef USE_FILES
#define cin fin
#define cout fout
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#endif


#define NMAX 1009
#define inf (1 << 30)
vector<int> G[NMAX];
int cap[NMAX][NMAX], flow[NMAX][NMAX];
int n, m, p[NMAX];
int source, destination;

void read_input() {
    cin >> n >> m;
    //cin >> source >> destination;
    source = 1, destination = n;

    for (int i = 1; i <= m; ++i) {
        int x, y,c;
        cin >> x >> y >> c;

        cap[x][y] += c;
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

int bfs(int source, int destination) {
    for (int i = 1; i  <= n; ++i) {
        p[i] = inf;
    }
    queue<int> q;
    q.push(source);
    p[source] = 0;

    while (!q.empty()) {
        auto node = q.front();
        q.pop();

        if (node == destination) {
            continue;
        }

        for (auto &it : G[node] ) {
            if (p[it] == inf && flow[node][it] < cap[node][it]) {
                p[it] = node;
                q.push(it);
            }
        }
    }

    return p[destination] != inf;
}

void solve() {
    int maxflow = 0;

    while (bfs(source, destination)) {
        for (auto &it : G[destination]) {
            if (p[it] != inf && flow[it][destination] < cap[it][destination]) {
                p[destination] = it;

                int minflow = inf;
                for (auto node = destination; node != source; node = p[node]) {
                    minflow = min(minflow, cap[p[node]][node] - flow[p[node]][node]);
                }

                if  (minflow > 0) {
                    maxflow += minflow;

                    for (auto node = destination; node != source; node = p[node]) {
                        flow[p[node]][node] += minflow;
                        flow[node][p[node]] -= minflow;
                    }
                }
            }
        }
    }

    cout << maxflow << "\n";
}

void clear_test() {
    for (int i = 1 ;i<=n; ++i) {
        G[i].clear();
    }
    n = 0;
    memset(cap, 0, sizeof(cap));
    memset(flow, 0, sizeof(flow));
    memset(p, 0, sizeof(p));
}

int main() {
    int t;
    //cin >> t;
    t = 1;

    while (t--) {
        read_input();
        solve();
        clear_test();
    }
    return 0;
}