Cod sursa(job #1827193)

Utilizator TincaMateiTinca Matei TincaMatei Data 11 decembrie 2016 15:48:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <cstdio>

const int MAX_N = 1000;
const int MAX_M = 5000;
const int INF = 2000000000;

int mc[1+2*MAX_M], last[1+MAX_N], next[1+2*MAX_M], cap[1+2*MAX_M], flux[1+2*MAX_M];
int inv[1+2*MAX_M];
bool viz[1+MAX_N];
int prev[1+MAX_N], muchie[1+MAX_N];
int q[MAX_N], st, dr;

inline void addMuchie(int id, int a, int b, int c) {
  mc[id] = b;
  next[id] = last[a];
  last[a] = id;
  cap[id] = c;
}

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

int total;

inline bool pump(int node) {
  int best, i;
  best = INF;
  i = node;
  while(i > 1 && best > 0) {
    best = min(best, cap[muchie[i]] - flux[muchie[i]]);
    i = prev[i];
  }
  if(best > 0) {
    i = node;
    while(i > 1) {
      flux[muchie[i]] += best;
      flux[inv[muchie[i]]] -= best;
      i = prev[i];
    }
    total = total + best;
    return true;
  } else
    return false;
}

bool augment(int dest) {
  int node;
  bool ok = false, rez;
  st = dr = 0;
  q[dr] = 1;
  ++dr;
  while(dr - st > 0) {
    node = q[st];
    ++st;
    int i = last[node];
    while(i != 0) {
      if(mc[i] != dest && flux[i] < cap[i] && !viz[mc[i]]) {
        prev[mc[i]] = node;
        muchie[mc[i]] = i;
        q[dr] = mc[i];
        ++dr;
        viz[mc[i]] = true;
      } else if(mc[i] == dest && flux[i] < cap[i]) {
        prev[mc[i]] = node;
        muchie[mc[i]] = i;
        rez = pump(mc[i]);
        if(rez) ok = true;
      }
      i = next[i];
    }
  }
  return ok;
}


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);
    addMuchie(i * 2 + 1, a, b, c);
    inv[i * 2 + 1] = i * 2 + 2;
    addMuchie(i * 2 + 2, b, a, 0);
    inv[i * 2 + 2] = i * 2 + 1;
  }
  fclose(fin);

  while(augment(n)) {
    for(int i = 1; i <= n; ++i) {
      viz[i] = false;
    }
  }

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