Cod sursa(job #2708452)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 18 februarie 2021 18:58:29
Problema Flux maxim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int NMAX = 1000;
const int MMAX = 5000;
const int INF = 1000000000;

struct muchie {
  int nod, vec, cf; /// cf = capacitate - flux
  muchie(int _nod = 0, int _vec = 0, int _cf = 0) : nod(_nod), vec(_vec), cf(_cf) {}
};

bool viz[NMAX + 5];
int n, m, src, dest;
int from[NMAX + 5];
muchie muchii[MMAX + 5];
vector<int> v[NMAX + 5];
queue<int> q;

bool bfs(int start) {
  for(int i = 1; i <= n; i++)
    viz[i] = false, from[i] = -1;

  q.push(start);
  viz[start] = true;
  while(!q.empty()) {
    int crt = q.front();
    q.pop();
    if(crt == dest)
      continue;

    for(int idx: v[crt]) {
      muchie mch = muchii[idx];
      if(!viz[mch.vec] && mch.cf) {
        q.push(mch.vec);
        from[mch.vec] = idx;
        viz[mch.vec] = true;
      }
    }
  }

  return viz[dest];
}

void add_flux(int nod, int &fmin) {
  if(from[nod] == -1)
    return;

  muchie &mch = muchii[from[nod]], &rmch = muchii[from[nod] ^ 1];
  fmin = min(fmin, mch.cf);
  if(fmin == 0)
    return;

  add_flux(mch.nod, fmin);
  mch.cf -= fmin;
  rmch.cf += fmin;
}

int main() {
  freopen("maxflow.in", "r", stdin);
  freopen("maxflow.out", "w", stdout);
  int x, y, z, flux, maxf;

  scanf("%d %d", &n, &m);
  src = 1, dest = n;
  for(int i = 0; i < m; i++) {
    scanf("%d %d %d", &x, &y, &z);
    muchii[i << 1] = muchie(x, y, z);
    v[x].push_back(i << 1);
    muchii[i << 1 | 1] = muchie(y, x);
    v[y].push_back(i << 1 | 1);
  }

  maxf = 0;
  while(bfs(src))
    for(int idx: v[dest]) {
      muchie rmch = muchii[idx ^ 1]; /// muchia inversa
      if(rmch.cf) {
        from[dest] = idx ^ 1;
        flux = INF;
        add_flux(dest, flux);
        maxf += flux;
      }
    }

  printf("%d", maxf);

  return 0;
}