Cod sursa(job #2012064)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 17 august 2017 19:40:34
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
#include <cstring>

const int MAX_N = 1000;

int cr[5 + MAX_N][5 + MAX_N];

std::vector<int> g[5 + MAX_N];
bool viz[5 + MAX_N];
int from[5 + MAX_N];

bool bfs(int s, int d) {
  memset(viz, 0, sizeof(viz));
  std::queue<int> q;
  q.push(s);
  viz[s] = true;
  from[s] = s;
  while (!q.empty() && !viz[d]) {
    int u = q.front();
    q.pop();
    for (auto v : g[u]) {
      if (!viz[v] && cr[u][v] > 0) {
        q.push(v);
        viz[v] = true;
        from[v] = u;
      }
    }
  }
  return viz[d];
}

int main() {
  freopen("maxflow.in", "r", stdin);
  freopen("maxflow.out", "w", stdout);
  
  int N, M;
  scanf("%d%d", &N, &M);
  for (int i = 1; i <= M; ++i) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    if (cr[x][y] == 0) {
      g[x].push_back(y);
      g[y].push_back(x);
    }
    cr[x][y] = z;
  }
  
  int s, d;
  s = 1;
  d = N;
  int ans = 0;
  while (bfs(s, d)) {
    for (auto it : g[d]) {
      int flux = INT_MAX;
      int u = it;
      if (cr[u][d] == 0 || !viz[u])
        continue;
      from[d] = u;
      u = d;
      while (u != s) {
        flux = std::min(flux, cr[from[u]][u]);
        u = from[u];
      }
      u = d;
      while (u != s) {
        cr[from[u]][u] -= flux;
        cr[u][from[u]] += flux;
        u = from[u];
      }
      ans += flux;
    }
  }  printf("%d\n", ans);
  return 0;
}