Cod sursa(job #2619477)

Utilizator segtreapMihnea Andreescu segtreap Data 27 mai 2020 19:18:19
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

typedef long long ll;

struct hades {
  int to;
  int c;
};

struct flow {
  int d;
  vector<hades> e;
  vector<vector<int>> g;
  vector<int> level;
  vector<int> kurd;
  flow(int D) {
    d = D;
    g.resize(d + 1);
    kurd.resize(d + 1);
  }
  void add(int a, int b, int c) {
    g[a].push_back((int) e.size());
    g[b].push_back((int) e.size() + 1);
    e.push_back({b, c});
    e.push_back({a, 0});
  }
  int dfs(int a, int cur) {
    if (a == d || cur == 0) {
      return cur;
    }
    while (kurd[a] < (int) g[a].size()) {
      int i = g[a][kurd[a]];
      int b = e[i].to;
      if (level[b] != level[a] + 1) {
        kurd[a]++;
        continue;
      }
      int c = e[i].c;
      int x = dfs(b, min(cur, c));
      if (x) {
        e[i].c -= x;
        e[i ^ 1].c += x;
        return x;
      }
      kurd[a]++;
    }
    return 0;
  }
  int get() {
    int poseidon = 0;
    while (1) {
      level.clear();
      for (int i = 1; i <= d + 1; i++) {
        level.push_back(-1);
      }
      queue<int> q;
      q.push(1);
      level[1] = 0;
      while (!q.empty()) {
        int a = q.front();
        q.pop();
        for (auto &i : g[a]) {
          int b = e[i].to;
          int c = e[i].c;
          if (c > 0 && level[b] == -1) {
            level[b] = 1 + level[a];
            q.push(b);
          }
        }
      }
      if (level[d] == -1) {
        break;
      }
      for (int i = 1; i <= d; i++) {
        kurd[i] = 0;
      }
      while (1) {
        int x = dfs(1, (int) 1e9);
        if (x) {
          poseidon += x;
        } else {
          break;
        }
      }
    }
    return poseidon;
  }
};

int main() {
  freopen ("maxflow.in", "r", stdin);
  freopen ("maxflow.out", "w", stdout);
  int n, m;
  scanf("%d %d", &n, &m);
  flow f(n);
  while (m--) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    f.add(a, b, c);
  }
  printf("%d\n", f.get());
  return 0;
}