Cod sursa(job #2016926)

Utilizator TincaMateiTinca Matei TincaMatei Data 30 august 2017 21:47:05
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 1000;
vector<int> graph[1+MAX_N];
int kappa[1+MAX_N][1+MAX_N], papa[1+MAX_N], q[MAX_N], bestfl[1+MAX_N];
bool viz[1+MAX_N];
int flow;

static inline int min(int a, int b) {
  if(a < b)
    return a;
  return b;
}

static inline bool augment(int n) {
  int st, dr;
  st = dr = 0;
  q[dr++] = 1;
  memset(viz + 1, 0, sizeof(bool) * n);
  viz[1] = true;
  bestfl[1] = 1000000000;
  while(st < dr && !viz[n]) {
    int nod = q[st++];
    for(auto it: graph[nod])
      if(kappa[nod][it] > 0 && !viz[it]) {
        viz[it] = true;
        q[dr++] = it;
        papa[it] = nod;
        bestfl[it] = min(bestfl[nod], kappa[nod][it]);
      }
  }
  
  if(viz[n]) {
    int i = n;
    flow += bestfl[n];
    while(i != 1) {
      int j = papa[i];
      kappa[j][i] -= bestfl[n];
      kappa[i][j] += bestfl[n];
      i = j;
    }
    return true;
  }
  return false;
}

int main() {
  int n, m, a, b, c;
  FILE *fin = fopen("maxflow.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for(int i = 0; i < m; ++i) {
    fscanf(fin, "%d%d%d", &a, &b, &c);
    kappa[a][b] = c;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  fclose(fin);

  for(int i = 1; i <= n; ++i)
    random_shuffle(graph[i].begin(), graph[i].end());

  while(augment(n));

  FILE *fout = fopen("maxflow.out", "w");
  fprintf(fout, "%d", flow);
  fclose(fout);
  return 0;
}

//flux maxim fara optimizarea cu arborele BFS