Cod sursa(job #2690920)

Utilizator retrogradLucian Bicsi retrograd Data 26 decembrie 2020 14:09:57
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;
using T = int;

struct Dinic {
  struct Edge { int from, to, nxt; T cap, flow; };
   
  vector<Edge> es;
  vector<int> graph, at, dist, q;
  
  Dinic(int n) : graph(n, -1) {}
  
  int AddEdge(int a, int b, T c) {
    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, 0);
    return es.size() - 2;
  } 
  bool bfs(int src, int dest, T need) {
    dist.assign(graph.size(), -1); q.clear();
    dist[src] = 0; q.push_back(src);
    for (int i = 0; i < (int)q.size(); ++i) {
      int node = q[i];
      for (int ei = graph[node]; ei >= 0; ei = es[ei].nxt) {
        const auto &e = es[ei];
        if (dist[e.to] == -1 && e.cap - e.flow >= need) {
          dist[e.to] = dist[node] + 1;
          q.push_back(e.to);
        }
      }
    }
    return dist[dest] != -1;
  }
  bool dfs(int node, int dest, T need) {
    if (node == dest) return true;
    for (int& ei = at[node]; ei != -1; ei = es[ei].nxt) {
      const auto &e = es[ei];
      if (dist[e.to] != dist[node] + 1 || e.cap < e.flow + need) 
        continue;
      if (dfs(e.to, dest, need)) {
        es[ ei ].flow += need;
        es[ei^1].flow -= need;
        return true;
      }
    }
    return false;
  }
  T Compute(int src, int dest) {
    T ret = 0;
    for (T lim = (1 << 16); lim; lim /= 2) {
      while (bfs(src, dest, lim)) {
        at = graph;
        while (dfs(src, dest, lim))
          ret += lim;
      }
    }
    return ret;
  }
};

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;
}