Cod sursa(job #1826887)

Utilizator TincaMateiTinca Matei TincaMatei Data 11 decembrie 2016 00:06:25
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>

const int MAX_N = 1000;
const int MAX_M = 5000;
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];

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

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

int total;

bool augment(int node, int dest, int &flow) {
  bool ok, r;
  int primit = flow, sent, raised;
  raised = 0;
  //printf("%d ", node);
  if(node == dest) {
    total += flow;
    //printf("%d ", primit);
    return true;
  } else {
    ok = false;
    int i = last[node];
    while(i != 0) {
      if(flux[i] < cap[i] && !viz[mc[i]]) {
        viz[mc[i]] = true;
        sent = min(primit - raised, cap[i] - flux[i]);
        r = augment(mc[i], dest, sent);
        if(r == true) {
          ok = true;
          raised = raised + sent;
          flux[i] += sent;
          flux[inv[i]] -= sent;
        }
      }
      i = next[i];
    }
    flow = raised;
  }
  return ok;
}

const int INF = 2000000000;

int main() {
  int n, m, a, b, c, x;
  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(1, n, x = INF)) {
    for(int i = 1; i <= n; ++i)
      viz[i] = false;
  }

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