Cod sursa(job #2619475)

Utilizator segtreapMihnea Andreescu segtreap Data 27 mai 2020 19:15:21
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;

#define sz(x) (int)(x).size()
#define pb push_back

struct Edge {
    int v;
    int flow, C;
    int rev;
};


template<int SZ> struct Dinic {
    int level[SZ], start[SZ];
    vector<Edge> adj[SZ];

    void addEdge(int u, int v, int C) {
        Edge a{v, 0, C, sz(adj[v])};
        Edge b{u, 0, 0, sz(adj[u])};
        adj[u].pb(a), adj[v].pb(b);
    }

    bool bfs(int s, int t) {
        for (int i = 0; i < SZ; i++) level[i] = -1;
        level[s] = 0;

        queue<int> q; q.push(s);
        while (!q.empty()) {
            int u = q.front(); q.pop();
            for (auto e: adj[u])
                if (level[e.v] < 0  && e.flow < e.C) {
                    level[e.v] = level[u] + 1;
                    q.push(e.v);
                }
        }

        return level[t] >= 0;
    }

    int sendFlow(int u, int flow, int t) {
        if (u == t) return flow;

        for (  ; start[u] < sz(adj[u]); start[u] ++) {
            Edge &e = adj[u][start[u]];

            if (level[e.v] == level[u]+1 && e.flow < e.C) {
                int curr_flow = min(flow, e.C - e.flow);
                int temp_flow = sendFlow(e.v, curr_flow, t);

                if (temp_flow > 0) {
                    e.flow += temp_flow;
                    adj[e.v][e.rev].flow -= temp_flow;
                    return temp_flow;
                }
            }
        }

        return 0;
    }

    int maxFlow(int s, int t) {
        if (s == t) return -1;
        int total = 0;

        while (bfs(s, t)) {
            for (int i = 0; i < SZ; i++) start[i] = 0;
            while (int flow = sendFlow(s, INT_MAX, t)) total += flow;
        }

        return total;
    }
};

int main() {
  freopen ("maxflow.in", "r", stdin);
  freopen ("maxflow.out", "w", stdout);
  int n, k;
  scanf("%d %d", &n, &k);
  Dinic<1007> f;
  while (k--) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    f.addEdge(a - 1, b - 1, c);
  }
  printf("%d\n", f.maxFlow(0, n - 1));
  return 0;
}