Cod sursa(job #2669823)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 8 noiembrie 2020 01:58:09
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> g, capacity, flow;

vector<bool> seen;

vector<int> dad;

int n;

bool bfs() {
  for (int i = 0; i < n; ++i) {
    seen[i] = false;
    dad[i] = -1;
  }
  queue<int> q;
  seen[0] = true;
  q.push(0);
  while ((int)q.size() > 0) {
    int u = q.front();
    q.pop();
    if (u + 1 == n) {
      continue;
    }
    for (int v : g[u]) {
      if (seen[v] == true || capacity[u][v] == flow[u][v]) {
        continue;
      }
      q.push(v);
      seen[v] = true;
      dad[v] = u;
    }
  }
  return seen[n - 1];
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);
  ifstream in("maxflow.in"); ofstream out("maxflow.out");
  int m; in >> n >> m;
  g.resize(n);
  capacity.resize(n, vector<int>(n, 0));
  flow.resize(n, vector<int>(n, 0));
  seen.resize(n, false);
  dad.resize(n, -1);
  for (int i = 0; i < m; ++i) {
    int u, v, c; in >> u >> v >> c;
    u -= 1;
    v -= 1;
    capacity[u][v] += c;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  int max_flow = 0;
  while (bfs() == true) {
    for (int v : g[n - 1]) {
      if (v == n - 1 || seen[v] == false || capacity[v][n - 1] == flow[v][n - 1]) {
        continue;
      }
      dad[n - 1] = v;
      int min_flow = INT_MAX;
      for (int node = n - 1; node != 0; node = dad[node]) {
        min_flow = min(min_flow, capacity[dad[node]][node] - flow[dad[node]][node]);
      }
      for (int node = n - 1; node != 0; node = dad[node]) {
        flow[dad[node]][node] += min_flow;
        flow[node][dad[node]] -= min_flow;
      }
      max_flow += min_flow;
    }
  }
  out << max_flow << "\n";
  return 0;
}