Cod sursa(job #2727892)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 22 martie 2021 16:33:14
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

#define int long long

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

const int inf = (int)1e18 + 5;
const int max_n = (int)1e3 + 5;

int n, m;

int r[max_n][max_n];

vector<int> g[max_n];

bool visited[max_n];

int lvl[max_n];

bool bfs() {
  for (int i = 1; i <= n; ++i) {
    visited[i] = false;
   // lvl[i] = 0;
  }
  queue<int> q;
  visited[1] = true;
  q.push(1);
  lvl[1] = 1;
  while ((int)q.size() > 0) {
    int u = q.front();
    q.pop();
    for (int v : g[u]) {
      if (!visited[v]) {
        if (r[u][v] > 0) {
          q.push(v);
          visited[v] = true;
          lvl[v] = 1 + lvl[u];
        }
      }
    }
  }
  return visited[n];
}

int dfs(int u, int flow) {
  if (u == n) {
    return flow;
  }
  for (int v : g[u]) {
    if (!visited[v]) {
      if (r[u][v] > 0 && lvl[v] == 1 + lvl[u]) {
        int res = dfs(v, min(flow, r[u][v]));
        if (res > 0) {
          r[u][v] -= res;
          r[v][u] += res;
          return res;
        } else {
          visited[v] = true;
        }
      }
    }
  }
  return 0;
}

int32_t main() {
  in >> n >> m;
  for (int i = 1; i <= m; ++i) {
    int u, v, c;
    in >> u >> v >> c;
    r[u][v] += c;
    g[u].push_back(v);
    g[v].push_back(u);
   // r[v][u] = -c;
  }
  int flow = 0;
  while (bfs() == true) {
    int pmp;
    fill(visited + 1, visited + n + 1, false);
    while (pmp = dfs(1, inf)) {
      fill(visited + 1, visited + n + 1, false);
      flow += pmp;
    }
  }
  out << flow << "\n";
  return 0;
}