Cod sursa(job #1990255)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 11 iunie 2017 04:40:15
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 5005;

int n, m, src, snk, flow;

vector<int> g[N];
int cap[N][N], flw[N][N], lvl[N], lst[N];

bool bfs() {
    deque<int> dq({src});
    int u;

    memset(lvl, 0x00, sizeof lvl);
    memset(lst, 0x00, sizeof lst);
    lvl[src] = 1;

    while (!dq.empty()) {
        u = dq.front();
        dq.pop_front();

        for (auto v: g[u]) if (!lvl[v] && cap[u][v] - flw[u][v] > 0) {
            lvl[v] = lvl[u] + 1;
            dq.push_back(v); } }

    return lvl[snk]; }

int dfs(int u, int mn) {
    if (u == snk) return mn;

    int v, f, pump = 0;
    for (; lst[u] < g[u].size(); ++lst[u]) {
        v = g[u][lst[u]];
        if (lvl[u] + 1 == lvl[v] && cap[u][v] - flw[u][v] > 0) {
            f = dfs(v, min(mn, cap[u][v] - flw[u][v]));
            flw[u][v]+= f;
            flw[v][u]-= f;
            pump+= f;
            mn-= f; } }

    return pump; }

int dinic() {
    int flow = 0;
    src = 1;
    snk = n;

    while (bfs())
        flow+= dfs(src, 2e9);

    return flow; }

int main() {
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    int u, v, c;

    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        scanf("%d%d%d", &u, &v, &c);
        g[u].push_back(v); cap[u][v]+= c;
        g[v].push_back(u); }

    printf("%d\n", dinic());

    return 0; }