Cod sursa(job #2433913)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 29 iunie 2019 18:37:10
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'

using namespace std;

bool CanIncreaseFlow(int source, int sink, vector<int> &parent, 
  vector<vector<int>> &adj, vector<vector<int>> &flow,
  vector<vector<int>> &capacity) {
  fill(parent.begin(), parent.end(), -1);
  parent[source] = -2;
  vector<int> q = {source};
  for (int i = 0; i < (int)q.size(); ++i) {
    int node = q[i];
    for (int &x : adj[node]) {
      if (parent[x] == -1 && capacity[node][x] - flow[node][x] > 0) {
        parent[x] = node;
        q.emplace_back(x);
      }
    }
  }
  return parent[sink] != -1;
}

int main() {
  ifstream cin("maxflow.in");
  ofstream cout("maxflow.out");
  
  int n, m; cin >> n >> m;
  vector<vector<int>> adj(n);
  vector<vector<int>> flow(n, vector<int>(n));
  vector<vector<int>> capacity(n, vector<int>(n));
  while (m--) {
    int u, v, cap; cin >> u >> v >> cap; --u, --v;
    adj[u].emplace_back(v);
    adj[v].emplace_back(u);
    capacity[u][v] += cap;
  }
  const int source = 0;
  const int sink = n - 1;
  int max_flow = 0;
  vector<int> parent(n);
  while (CanIncreaseFlow(source, sink, parent, adj, flow, capacity)) {
    for (int &x : adj[sink]) {
      int vertex = x, added_flow = capacity[x][sink] - flow[x][sink];
      if (parent[x] != -1 && added_flow > 0) {
        while (vertex != source) {
          added_flow = min(added_flow, 
            capacity[parent[vertex]][vertex] - flow[parent[vertex]][vertex]);
          vertex = parent[vertex];
        }
        flow[x][sink] += added_flow;
        max_flow += added_flow;
        vertex = x;
        while (vertex != source) {
          flow[parent[vertex]][vertex] += added_flow;
          flow[vertex][parent[vertex]] -= added_flow;
          vertex = parent[vertex];
        }
      }
    }
  }
  cout << max_flow << endl;
}