Cod sursa(job #2749156)

Utilizator retrogradLucian Bicsi retrograd Data 5 mai 2021 14:28:41
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;
using T = int;

struct Dinic {
  struct Edge { int from, to, nxt; T cap, flow; };
  
  int n;
  vector<Edge> es;
  vector<int> graph, at, dist, q;
  
  Dinic(int n) : n(n), graph(n, -1) {}
  
  int AddEdge(int a, int b, T c, bool dir = true) {
    auto add = [&](int a, int b, T c) {
      es.push_back({a, b, graph[a], c, 0});
      graph[a] = es.size() - 1;
    };
    add(a, b, c); add(b, a, dir ? 0 : c);
    return es.size() - 2;
  } 
  T dfs(int node, int dest, int d, T need) {
    if (!need || node == dest) return need;
    if (dist[node] < d) return 0;
    dist[node] = d; T ret = 0;
    for (int& ei = at[node]; ei != -1; ei = es[ei].nxt) {
      const auto &e = es[ei];
      if (T now = dfs(e.to, dest, d + 1, 
          min(need, e.cap - e.flow))) {
        es[ ei ].flow += now;
        es[ei^1].flow -= now;
        ret += now; need -= now;
      }
      if (!need) break;
    }
    return ret;
  }
  T Compute(int src, int dest) {
    T ret = 0;
    for (int ch = 1; ch--; ) {
      at = graph; dist.assign(n, n);
      while (T now = dfs(src, dest, 0, numeric_limits<T>::max())) 
        ret += now, ch = 1;
    }
    return ret;
  }
  bool SideOfCut(int x) { return dist[x] == n; } 
};

int main() {
  ifstream cin("maxflow.in");
  ofstream cout("maxflow.out");
  int n, m; cin >> n >> m;
  Dinic D(n);
  for (int i = 0; i < m; ++i) {
    int a, b, c; cin >> a >> b >> c; 
    D.AddEdge(a - 1, b - 1, c);
  }
  cout << D.Compute(0, n - 1) << endl;
  return 0;
}