Cod sursa(job #2808936)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 25 noiembrie 2021 18:13:36
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

const int N = 1005;

vector<int> gr[N];
int cap[N][N], tata[N];
bool viz[N];
int n, m;

void cleanup() {
  memset(viz, 0, (n + 1) * sizeof(bool));
  memset(tata, 0, (n + 1) * sizeof(int));
}

bool bfs() {
  queue<int> q;
  q.push(1);
  viz[1] = true;
  while (!q.empty()) {
    auto nod = q.front();
    q.pop();
    for (auto vec : gr[nod]) {
      if (viz[vec]) continue;
      if (cap[nod][vec] == 0) continue;
      viz[vec] = true;
      q.push(vec);
      tata[vec] = nod;
    }
  }
  return viz[n];
}

void adjust_flow() {
  for (auto leaf : gr[n]) {
    if (!viz[leaf]) continue;
    int min_flow = cap[leaf][n];

    int nod = leaf;
    while (tata[nod]) {
      min_flow = min(min_flow, cap[tata[nod]][nod]);
      nod = tata[nod];
    }

    cap[leaf][n] -= min_flow;
    cap[n][leaf] += min_flow;
    nod = leaf;
    while (tata[nod]) {
      cap[tata[nod]][nod] -= min_flow;
      cap[nod][tata[nod]] += min_flow;
      nod = tata[nod];
    }
  }
}

int main() {
  ifstream cin("maxflow.in");
  ofstream cout("maxflow.out");
  cin >> n >> m;
  while (m--) {
    int x, y;
    cin >> x >> y;
    cin >> cap[x][y];
    gr[x].push_back(y);
    gr[y].push_back(x);
  }
  cin.close();
  while (bfs()) {
    adjust_flow();
    cleanup();
  }
  int ans = 0;
  for (auto nod : gr[1])
    ans += cap[nod][1];
  cout << ans << "\n";
  cout.close();
  return 0;
}