Cod sursa(job #3033303)

Utilizator dorufDoru Floare doruf Data 23 martie 2023 18:20:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define eb emplace_back

const string TASK("maxflow");

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

const int N = 1005;
int c[N][N], f[N][N], t[N];
vector<int> g[N];
int n, m;
bitset<N> vis;

bool bfs(int src, int dest) {
  vis.reset();
  vis[src] = 1;
  queue<int> q;
  q.push(src);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (u == dest) continue;
    for (auto v : g[u])
      if (!vis[v] && c[u][v] > 0) {
        vis[v] = 1;
        t[v] = u;
        q.push(v);
      }
  }
  return vis[dest];
}
int maxflow(int src, int dest) {
  int ans = 0;
  while (bfs(src, dest)) {
    for (auto u : g[dest]) {
      if (!vis[u] || c[u][dest] <= 0)
        continue;
      t[dest] = u;
      int flux = 1e9;
      for (int i = dest; i != src; i = t[i])
        flux = min(flux, c[t[i]][i]);
      for (int i = dest; i != src; i = t[i]) {
        c[t[i]][i] -= flux;
        c[i][t[i]] += flux;
      }
      ans += flux;
    }
  }
  return ans;
}

int main() {
  fin >> n >> m;
  for (int u, v, w, i = 1; i <= m; ++i) {
    fin >> u >> v >> w;
    g[u].eb(v);
    g[v].eb(u);
    c[u][v] += w;
  }
  fout << maxflow(1, n);
}