Cod sursa(job #2412208)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 21 aprilie 2019 20:02:08
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 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);
vector < vector < int > > currentFlow(1001, vector < int > (1001));
vector < vector < int > > maxCap(1001, vector < int > (1001));

int s, t;

bool bfs() {

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

  while (not q.empty()) {

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

    if (curNode == t) return true;

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

  return false;
}

int dfs(int curNode, int flow) {

  if (curNode == t) return flow;

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

  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);
    gr[b].push_back(a);
    maxCap[a][b] = c;
  }

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

  while (bfs()) {
    maxFlow += dfs(s, 2e9);
  }

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