Cod sursa(job #1990254)

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

using i64 = long long;

const int N = 5005,
          M = 3e4 + 5;

struct Edg {
    int v;
    i64 c, f; };

int n, m, src, snk;
i64 flow;

vector<int> g[N];
Edg edgs[M * 2];
int lvl[N], gws[N], lst_edg[N];

bool bfs() {
    static int it = 0; ++it;
    deque<int> dq({src});
    int u;

    memset(lst_edg, 0x00, sizeof lst_edg);
    gws[src] = it;
    lvl[src] = 1;

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

        for (auto v: g[u]) if (gws[edgs[v].v] != it && edgs[v].c - edgs[v].f > 0) {
            dq.push_back(edgs[v].v);
            lvl[edgs[v].v] = lvl[u] + 1;
            gws[edgs[v].v] = it; } }

    return (gws[snk] == it); }

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

    i64 pump, s(0);
    int v;

    for (; lst_edg[u] < g[u].size(); ++lst_edg[u]) {
        v = g[u][lst_edg[u]];
        if (lvl[u] + 1 == lvl[edgs[v].v] && edgs[v].c - edgs[v].f) {
            pump = dfs(edgs[v].v, min(mn, edgs[v].c - edgs[v].f));

            edgs[v].f+= pump;
            edgs[v ^ 1].f-= pump;

            mn-= pump;
            s+= pump; } }

    return s; }

void dinic() {
    src = 1;
    snk = n;

    while (bfs())
        flow+= dfs(src, 1e18); }

int main() {
#ifdef HOME
    freopen("dat.in", "r", stdin);
    freopen("dat.out", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int u, v, c, p(0);

    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        scanf("%d%d%d", &u, &v, &c);
        if (u != v) {
            g[u].push_back(p++);
            g[v].push_back(p++);
            edgs[p - 2] = {v, c, 0};
            edgs[p - 1] = {u, c, 0}; } }

    dinic();

    printf("%lld\n", flow);

    return 0; }