Cod sursa(job #1628283)

Utilizator hrazvanHarsan Razvan hrazvan Data 3 martie 2016 22:35:24
Problema Taramul Nicaieri Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <stdio.h>
#define MAXN 100
#define INF 2000000000
#define MAXMCH 60000
int nod[MAXMCH], next[MAXMCH], cpc[MAXMCH], fol[MAXMCH], ult[2 * MAXN + 2], dr;
int q[MAXN + 2], prev[MAXN], mch[MAXN];
char viz[MAXN];

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

inline char bfs(int s, int d){
  memset(viz, 0, sizeof viz);
  int st, dr, p, poz;
  q[0] = s;
  st = 0;
  dr = 1;
  while(st < dr){
    p = q[st];
    st++;
    poz = ult[p];
    while(poz != -1){
      if(!viz[nod[poz]] && cpc[poz] > fol[poz]){
        viz[nod[poz]] = 1;
        q[dr] = nod[poz];
        dr++;
        prev[nod[poz]] = p;
        mch[nod[poz]] = poz;
      }
      poz = next[poz];
    }
  }
  return viz[d];
}

inline void add(int x, int y, int c){
  nod[dr] = y;
  next[dr] = ult[x];
  cpc[dr] = c;
  ult[x] = dr;
  dr++;
}

int main(){
  FILE *in = fopen("harta.in", "r");
  int n, i, j, x, y, s, d, sum = 0;
  fscanf(in, "%d", &n);
  s = 2 * n;
  d = 2 * n + 1;
  memset(ult, -1, sizeof ult);
  for(i = 0; i < n; i++){
    for(j = 0; j < n; j++){
      if(i != j){
        add(i, j + n, 1);
        add(j + n, i, 0);
        add(j, i + n, 1);
        add(i + n, j, 0);
      }
    }
  }
  for(i = 0; i < n; i++){
    fscanf(in, "%d%d", &x, &y);
    add(s, i, x);
    add(i, s, 0);
    add(i + n, d, y);
    add(d, i + n, 0);
    sum += x;
  }
  fclose(in);
  int augm, poz, p;
  while(bfs(s, d)){
    poz = ult[d];
    while(poz != -1){
      prev[d] = nod[poz];
      mch[d] = poz - 1;
      if(poz & 1 && viz[nod[poz]] && cpc[poz - 1] > fol[poz - 1]){
        augm = INF;
        p = d;
        while(p != s){
          augm = min2(augm, cpc[mch[p]] - fol[mch[p]]);
          p = prev[p];
        }
        p = d;
        while(p != s){
          fol[mch[p]] += augm;
          if(mch[p] & 1)
            fol[mch[p] - 1] -= augm;
          else
            fol[mch[p] + 1] -= augm;
          p = prev[p];
        }
      }
      poz = next[poz];
    }
  }
  int k = 0;
  FILE *out = fopen("harta.out", "w");
  fprintf(out, "%d\n", sum);
  for(i = 0; i < n; i++){
    for(j = 0; j < n; j++){
      if(i != j){
        if(fol[k] > 0)
          fprintf(out, "%d %d\n", i + 1, j + 1);
        if(fol[k + 2] > 0)
          fprintf(out, "%d %d\n", j + 1, i + 1);
        k += 4;
      }
    }
  }
  fclose(out);
  return 0;
}