Cod sursa(job #2293493)

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

vector < vector < int > > capacity;
vector < vector < int > > residual;
vector < bool > viz;
vector < int > road;

int n, m, hi;
bool DFS(int node = 0) {
    road[hi++] = node;
    viz[node] = true;
    
    if (node == n - 1) {
        return true;
    }
    for (int i = 0; i < n; ++i) {
        if (viz[i] == false && residual[node][i]) {
            if (DFS(i)) {
                return true;
            }
        }
    }
    --hi;
    return false;
}

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

    fin >> n >> m;

    capacity.resize(n);
    for (auto &x: capacity) x.resize(n);

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

        capacity[a][b] += c;
    }

    int totalFlow = 0;
    residual = capacity;
    viz.resize(n);
    road.resize(n);
    while (DFS()) {
        int maxFlow = INT_MAX;
        for (int i = 1; i < hi; ++i) {
            int prev = road[i - 1];
            int now = road[i];
            maxFlow = min(maxFlow, residual[prev][now]);
        }
        for (int i = 1; i < hi; ++i) {
            int prev = road[i - 1];
            int now = road[i];
            residual[prev][now] -= maxFlow;
            residual[now][prev] += maxFlow;
        }

        totalFlow += maxFlow;
        hi = 0;
        viz.assign(n, false);
    }

    fout << totalFlow;
    return 0;
}