Cod sursa(job #3125687)

Utilizator dorufDoru Floare doruf Data 4 mai 2023 09:13:15
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;

const string taskname("maxflow");

ifstream fin(taskname + ".in");
ofstream fout(taskname + ".out");

const int N = 5 + 1000;
vector<int> g[N];
int C[N][N], F[N][N];
int n, m, tata[N];
bitset<N> vis;

bool bfs(int from, int to) {
  vis.reset();
  vis[from] = 1;
  queue<int> q;
  q.emplace(from);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (u == to) continue;
    for (auto v : g[u])
    if (!vis[v] && F[u][v] < C[u][v]) {
      vis[v] = 1;
      tata[v] = u;
      q.emplace(v);
    }
  }
  return vis[to];
}

int main() {
  fin >> n >> m;
  while (m--) {
    int u, v, w;
    fin >> u >> v >> w;
    g[u].emplace_back(v);
    g[v].emplace_back(u);
    C[u][v] += w;
  }
  int ans = 0;
  while (bfs(1, n)) {
    int flux = 1e9;
    for (int i = n; i != 1; i = tata[i])
      flux = min(flux, C[tata[i]][i] - F[tata[i]][i]);
    for (int i = n; i != 1; i = tata[i]) {
      F[tata[i]][i] += flux;
      F[i][tata[i]] -= flux;
    }
    ans += flux;
  }
  fout << ans;
}