Cod sursa(job #2553282)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 21 februarie 2020 20:23:43
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;

ifstream fi("maxflow.in");
ofstream fo("maxflow.out");

using pii = pair<int, int>;

const int N = 1e5 + 5;

struct Edge {
    int v, cap;
};

vector<int> g[N];
bool f[N];
pii far[N];

vector<Edge> edgs;
int n, m;

static bool bfs() {
    deque<int> dq;

    f[1] = true;
    for (int i = 2; i <= n; ++i)
        f[i] = false;
    dq.push_back(1);

    while (!dq.empty()) {
        int u = dq.front();
        dq.pop_front();
        for (auto i: g[u]) {
            if (edgs[i].cap > 0 && !f[edgs[i].v]) {
                dq.push_back(edgs[i].v);
                f[edgs[i].v] = true;
                far[edgs[i].v] = {u, i};
            }
        }
    }

    if (f[n])
        return true;
    return false;
}

int main() {
    int ans = 0;

    fi >> n >> m;
    edgs.reserve(m * 2);
    for (int u, v, c, i = 0; i < m; ++i) {
        fi >> u >> v >> c;
        g[u].push_back(edgs.size());
        edgs.push_back({v, c});
        g[v].push_back(edgs.size());
        edgs.push_back({u, 0});
    }

    while (bfs()) {
        for (auto i: g[n]) {
            int minc = edgs[i ^ 1].cap, fiu = edgs[i].v;
            if (!f[fiu])
                continue;
            for (int nod = fiu; nod != 1 && minc > 0; nod = far[nod].x)
                minc = min(minc, edgs[far[nod].y].cap);
            if (minc <= 0)
                continue;
            edgs[i].cap+= minc;
            edgs[i ^ 1].cap-= minc;
            for (int nod = fiu; nod != 1 && minc > 0; nod = far[nod].x) {
                edgs[far[nod].y ^ 1].cap+= minc;
                edgs[far[nod].y].cap-= minc;
            }
            ans+= minc;
        }
    }

    fo << ans << '\n';

    return 0; }