Cod sursa(job #2412201)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 21 aprilie 2019 19:42:01
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
// By Stefan Radu

#include <algorithm>
#include <fstream>
#include <iomanip>
#include <cassert>
#include <vector>
#include <string>
#include <cctype>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <map>
#include <set>

using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

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

typedef pair < int, int > pii;
typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;

vector < vector < int > > gr(1001);
vector < int > lvl(1001), used(1001);
vector < vector < int > > currentFlow(1001, vector < int > (1001));
vector < vector < int > > maxCap(1001, vector < int > (1001));

int cnt = 0, s, t;

bool bfs() {

  ++ cnt;
  queue < int > q;
  q.push(s);
  lvl[s] = 1;

  while (not q.empty()) {

    auto curNode = q.front();
    q.pop();

    if (curNode == t) return true;

    for (auto x : gr[curNode]) {
      if (lvl[x]) continue;
      if (currentFlow[curNode][x] < maxCap[curNode][x]) {
        lvl[x] = lvl[curNode] + 1;
        q.push(x);
      }
    }
  }

  return false;
}

ll dfs(int curNode, ll flow) {

  used[curNode] = cnt;
  if (curNode == t) return flow;

  int ret = 0;
  for (auto x : gr[curNode]) {
    if (used[x] == cnt) continue;
    if (lvl[x] == lvl[curNode] + 1 and currentFlow[curNode][x] < maxCap[curNode][x]) {
      auto k = dfs(x, min(flow, 1ll * maxCap[curNode][x] - currentFlow[curNode][x]));
      currentFlow[curNode][x] += k;
      currentFlow[x][curNode] -= k;
      flow -= k;
      ret += k;
    }
  }

  return ret;
}

int main() {

#ifdef STEF
  freopen("input", "r", stdin);
  freopen("output", "w", stdout);
#endif

  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);

  int n, m;
  cin >> n >> m;

  for (int i = 1; i <= m; ++ i) {
    int a, b, c;
    cin >> a >> b >> c;
    gr[a].push_back(b);
    maxCap[a][b] = c;
  }

  s = 1, t = n;
  ll maxFlow = 0;

  while (bfs()) {
    maxFlow += dfs(s, 2e18);
    fill(lvl.begin(), lvl.end(), 0);
  }

  cout << maxFlow << '\n';
}