Cod sursa(job #2294930)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 2 decembrie 2018 22:55:20
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

vector < vector < int > > G;
vector < vector < int > > residual;
vector < bool > viz;
vector < int > parent;

int n, m, hi;
bool BFS(int node) {
    viz.assign(n, false);
    queue < int > Q;

    parent[node] = -1;
    Q.push(node);
    viz[node] = true;
    while (!Q.empty()) {
        node = Q.front();
        Q.pop();

        for (auto x: G[node]) {
            if (viz[x] == false && residual[node][x]) {
                Q.push(x);
                viz[x] = true;
                parent[x] = node;
            }
        }
    }

    return viz[n - 1];
}

int main() {
    ios::sync_with_stdio(false);

    fin >> n >> m;

    residual.resize(n);
    G.resize(n);
    for (auto &x: residual) x.resize(n);

    for (int i = 0; i < m; ++i) {
        int a, b, c; 
        fin >> a >> b >> c;
        --a; --b;

        residual[a][b] += c;
        G[a].push_back(b);
        G[b].push_back(a);
    }

    int totalFlow = 0;
    viz.resize(n);
    parent.resize(n);
    while (BFS(0)) {
        int maxFlow = INT_MAX;
        for (int now = n - 1; now != 0; now = parent[now]) {
            int prev = parent[now];
            maxFlow = min(maxFlow, residual[prev][now]);
        }
        for (int now = n - 1; now != 0; now = parent[now]) {
            int prev = parent[now];
            residual[prev][now] -= maxFlow;
            residual[now][prev] += maxFlow;
        }

        totalFlow += maxFlow;
    }

    fout << totalFlow;
    return 0;
}