Cod sursa(job #2628916)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 18 iunie 2020 11:29:15
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int NMAX = 1000;
const int MMAX = 5000;
const int FMAX = 220000;

struct muchie {
  int a, b; /// a -> inceput, b -> sfarsit
  int cf;   /// capacitate - flux

  muchie(int ca = 0, int cb = 0, int ccf = 0) {
    a = ca, b = cb, cf = ccf;
  }
};

bool uz[NMAX + 5];
int n, m, flux;
int from[NMAX + 5];

muchie muchii[MMAX * 2 + 5];
vector<int> v[NMAX + 5];
queue<int> q;

bool bfs(int start) {
  for(int i = 1; i <= n; i++)
    uz[i] = false;

  uz[start] = true;
  from[start] = -1;
  q.push(start);

  bool viz_sursa = false;

  while(!q.empty()) {
    int crt = q.front();
    q.pop();

    if(crt == n) {
      viz_sursa = true;
      continue;
    }

    for(int vec: v[crt]) {
      muchie &mvec = muchii[vec];

      if(!uz[mvec.b] && mvec.cf > 0) {
        uz[mvec.b] = true;
        from[mvec.b] = vec;
        q.push(mvec.b);
      }
    }
  }

  return viz_sursa;
}

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

  muchie &mback = muchii[from[nod]], &rmback = muchii[from[nod] ^ 1];
  fmin = min(fmin, mback.cf);
  add_flux(mback.a, fmin);

  mback.cf -= fmin;
  rmback.cf += fmin;
}

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

  scanf("%d %d", &n, &m);
  for(int i = 0; i < m; i++) {
    int x, y, z;

    scanf("%d %d %d", &x, &y, &z);
    muchii[2 * i] = muchie(x, y, z);
    muchii[2 * i + 1] = muchie(y, x, 0);

    v[x].push_back(2 * i);
    v[y].push_back(2 * i + 1);
  }

  while(bfs(1)) {
    for(int vec: v[n]) {
      muchie rmvec = muchii[vec ^ 1]; /// muchie inversa, care duce la sursa

      if(uz[rmvec.a] && rmvec.cf > 0) {
        from[n] = vec ^ 1;

        int fmin = FMAX;
        add_flux(n, fmin);
        flux += fmin;
      }
    }
  }

  printf("%d", flux);

  return 0;
}