Cod sursa(job #1696602)

Utilizator hrazvanHarsan Razvan hrazvan Data 29 aprilie 2016 15:09:36
Problema Traseu Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <stdio.h>
#define MAXN 60
#define MAXM 1770
#define TOTM (2 * (MAXM + 2 * MAXN))
#define INF 0x7f7f7f7f
int ut[MAXN + 2], nd[TOTM], nxt[TOTM], cpc[TOTM], fol[TOTM], cost[TOTM], dr;
int gradin[MAXN], gradout[MAXN];
int dist[MAXN + 2], prev[MAXN + 2], mch[MAXN + 2];
int q[(MAXN + 2) * (MAXN + 2)], sq, dq;
char inq[MAXN + 2];

inline int add(int x, int y, int c, int cp){
  nd[dr] = y;
  nxt[dr] = ut[x];
  ut[x] = dr;
  cost[dr] = c;
  cpc[dr] = cp;
  dr++;
}

inline void bellman(int x){
  memset(dist, 0x7f, sizeof dist);
  memset(inq, 0, sizeof inq);
  q[0] = x;
  sq = 0;
  dq = 1;
  inq[x] = 1;
  dist[x] = 0;
  int nod, poz;
  while(sq < dq){
    nod = q[sq];
    inq[nod] = 0;
    sq++;
    poz = ut[nod];
    while(poz != -1){
      if(fol[poz] < cpc[poz] && dist[nd[poz]] > dist[nod] + cost[poz]){
        dist[nd[poz]] = dist[nod] + cost[poz];
        prev[nd[poz]] = nod;
        mch[nd[poz]] = poz;
        if(!inq[nd[poz]]){
          q[dq] = nd[poz];
          dq++;
          inq[nd[poz]] = 1;
        }
      }
      poz = nxt[poz];
    }
  }
}

int main(){
  FILE *in = fopen("traseu.in", "r");
  int n, m, x, y, z, i, sum = 0, s, d;
  fscanf(in, "%d%d", &n, &m);
  s = n;
  d = n + 1;
  memset(ut, -1, sizeof ut);
  for(i = 0; i < m; i++){
    fscanf(in, "%d%d%d", &x, &y, &z);
    x--;  y--;
    add(x, y, z, INF);
    add(y, x, -z, 0);
    gradin[y]++;
    gradout[x]++;
    sum += z;
  }
  fclose(in);
  for(i = 0; i < n; i++){
    if(gradin[i] > gradout[i]){
      add(s, i, 0, gradin[i] - gradout[i]);
      add(i, s, 0, 0);
    }
    else  if(gradout[i] > gradin[i]){
      add(i, d, 0, gradout[i] - gradin[i]);
      add(d, i, 0, 0);
    }
  }
  char augm = 1;
  int nod;
  while(augm == 1){
    bellman(s);
    if(dist[d] == INF)
      augm = 0;
    else{
      nod = d;
      while(nod != s){
        fol[mch[nod]]++;
        if(mch[nod] & 1)
          fol[mch[nod] - 1]--;
        else
          fol[mch[nod] + 1]--;
        sum += cost[mch[nod]];
        nod = prev[nod];
      }
    }
  }
  FILE *out = fopen("traseu.out", "w");
  fprintf(out, "%d", sum);
  fclose(out);
  return 0;
}