Cod sursa(job #2247087)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 27 septembrie 2018 21:15:50
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1005;

int cap[MAXN][MAXN], flow[MAXN][MAXN];
vector<int>G[MAXN];
int from[MAXN];

bool bfs(int s, int d) {
  queue<int>q;
  q.push(s);
  memset(from, -1, sizeof(from));
  from[s] = 0;
  while (!q.empty() && from[d] == -1) {
    int aux = q.front();
    q.pop();
    for (auto it:G[aux])
      if (from[it] == -1 && cap[aux][it] - flow[aux][it] > 0) {
        from[it] = aux;
        q.push(it);
      }
  }
  return (from[d] != -1);
}

int maxFlow(int s, int d) {
  int ans = 0;
  while (bfs(s, d)) {
    for (auto it:G[d]) {
      int minim = cap[it][d] - flow[it][d];
      if (minim == 0 || from[it] == -1)
        continue;
      int nod = it;
      while (nod != s) {
        minim = min(minim, cap[from[nod]][nod] - flow[from[nod]][nod]);
        nod = from[nod];
      }
      nod = it;
      flow[it][d] += minim;
      flow[d][it] -= minim;
      while (nod != s) {
        flow[from[nod]][nod] += minim;
        flow[nod][from[nod]] -= minim;
        nod = from[nod];
      }
      nod = d;
      ans += minim;
    }
  }
  return ans;
}

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, c;
    scanf("%d%d%d", &x, &y, &c);
    G[x].push_back(y);
    G[y].push_back(x);
    cap[x][y] = c;
  }

  printf("%d\n", maxFlow(1, n));

  return 0;
}