Cod sursa(job #2680247)

Utilizator retrogradLucian Bicsi retrograd Data 3 decembrie 2020 00:20:15
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

struct Dinic {
  struct Edge { int to, cap, flow, nxt; };
  
  vector<Edge> es;
  vector<int> graph, at, dist, q;
  int src = 0, dest = 1;
  
  Dinic(int n) : graph(n, -1), dist(n, -1) {}

  void AddEdge(int from, int to, int cap) {
    auto add = [&](int from, int to, int cap) {
      es.push_back(Edge {to, cap, 0, graph[from]});
      graph[from] = es.size() - 1;
    };
    add(from, to, cap);
    add(to, from, 0);
  }
  
  bool bfs() {
    q.clear();
    fill(dist.begin(), dist.end(), -1);
    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) {
        auto &e = es[ei];
        if (dist[e.to] == -1 && e.flow < e.cap)
          dist[e.to] = dist[node] + 1, q.push_back(e.to);
      }
    }
    return dist[dest] != -1;
  }

  int dfs(int node, int flow) {
    if (flow == 0) return 0;
    if (node == dest) return flow;
    while (at[node] != -1) {
      int ei = at[node], ret; auto &e = es[ei];
      if (dist[e.to] == dist[node] + 1 && 
          (ret = dfs(e.to, min(flow, e.cap - e.flow)))) {
        es[ ei ].flow += ret;
        es[ei^1].flow -= ret;
        return ret;
      }
      at[node] = e.nxt;
    }
    return 0;
  }
  
  int Compute(int src, int dest) {
    this->src = src; this->dest = dest; int ret = 0;
    while (bfs()) {
      at = graph;
      while (int flow = dfs(src, 2e9))
        ret += flow;
    }
    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;
}