Cod sursa(job #1534048)

Utilizator hrazvanHarsan Razvan hrazvan Data 23 noiembrie 2015 11:07:54
Problema Flux maxim Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#define MAXN 1000
#define MAXM 5000
#define INF 2000000000
int ult[MAXN], nod[2 * MAXM], next[2 * MAXM], cap[2 * MAXM], fol[2 * MAXM], suma[MAXN];
char tr[MAXN];
int n;

inline int min2(int a, int b){
  return a < b ? a : b;
}

int dfs(int x, int max){
  if(max <= 0)
    return 0;
  if(x == n - 1){
    suma[x] += max;
    return max;
  }
  tr[x] = 1;
  int poz = ult[x], k = 0, sk = 0;
  while(poz != -1){
    if(!tr[nod[poz]]){
      k = dfs(nod[poz], min2(max, cap[poz] - fol[poz]));
      fol[poz] += k;
      if(poz & 1)
        fol[poz - 1] -= k;
      else
        fol[poz + 1] -= k;
      sk += k;
      max -= k;
    }
    poz = next[poz];
  }
  suma[x] += sk;
  return sk;
}

int main(){
  FILE *in = fopen("maxflow.in", "r");
  int m, i, x, y, z, dr = 0;
  fscanf(in, "%d%d", &n, &m);
  for(i = 0; i < n; i++)
    ult[i] = -1;
  for(i = 0; i < m; i++){
    fscanf(in, "%d%d%d", &x, &y, &z);
    x--;  y--;
    nod[dr] = x;
    next[dr] = ult[y];
    ult[y] = dr;
    cap[dr] = 0;
    dr++;
    nod[dr] = y;
    next[dr] = ult[x];
    ult[x] = dr;
    cap[dr] = z;
    dr++;
  }
  fclose(in);
  int last = -1;
  while(last != suma[n - 1]){
    last = suma[n - 1];
    memset(tr, 0, sizeof tr);
    dfs(0, INF);
  }
  FILE *out = fopen("maxflow.out", "w");
  fprintf(out, "%d", suma[n - 1]);
  fclose(out);
  return 0;
}