Cod sursa(job #1789711)

Utilizator deividFlorentin Dumitru deivid Data 27 octombrie 2016 14:26:26
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <vector>
#include <queue>

#define maxdim 1005

using namespace std;

int n, m;
int cp[maxdim][maxdim], f[maxdim][maxdim];
int viz[maxdim], T[maxdim];
vector<int> G[maxdim];

int bfs() {
  for (int i = 1; i <= n; ++i) {
    viz[i] = 0;
    T[i] = 0;
  }

  queue<int> q;
  q.push(1);
  viz[1] = 1;
  int ok = 0;
  while (!q.empty()) {
    int nod = q.front(); q.pop();
    for (int vecin : G[nod]) {
      if (cp[nod][vecin] > f[nod][vecin] && !viz[vecin]) {
        if (vecin == n) {
          ok = 1;
          continue;
        }
        viz[vecin] = 1;
        T[vecin] = nod;
        q.push(vecin);
      }
    }
  }
  return ok;
}

int maxflow() {
  int sol = 0;

  while (bfs()) {
    for (int prev : G[n]) {
      T[n] = prev;
      int nod;
      int crt_flow = (1 << 29);
      for (nod = n; nod != 1; nod = T[nod]) {
        crt_flow = min(crt_flow, cp[T[nod]][nod] - f[T[nod]][nod]);
      }
      if (nod != 1) {
        continue;
      }
      for (nod = n; nod != 1; nod = T[nod]) {
        f[T[nod]][nod] += crt_flow;
        f[nod][T[nod]] -= crt_flow;
      }
      sol += crt_flow;
    }
  }

  return sol;
}

int main() {
  freopen("maxflow.in", "r", stdin);
  freopen("maxflow.out", "w", stdout);

  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    int x, y, c; scanf("%d %d %d", &x, &y, &c);
    cp[x][y] = c;
    G[x].push_back(y);
    G[y].push_back(x);
  }

  printf("%d\n", maxflow());

  return 0;
}