Cod sursa(job #1535132)

Utilizator hrazvanHarsan Razvan hrazvan Data 24 noiembrie 2015 13:13:33
Problema Critice Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#define MAXN 1000
#define MAXM 10000
#define INF 2000000000
int ult[MAXN], next[2 * MAXM], nod[2 * MAXM], cap[2 * MAXM], fol[2 * MAXM];
int q[MAXN], sc[MAXN], prev[MAXN];
char viz[MAXN], crit[MAXM];

inline int invs(int x){
  if(x & 1)
    return x - 1;
  else
    return x + 1;
}

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

int main(){
  FILE *in = fopen("critice.in", "r");
  int n, m, i, a, b, c, 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", &a, &b, &c);
    a--;  b--;
    cap[dr] = c;
    nod[dr] = a;
    next[dr] = ult[b];
    ult[b] = dr;
    dr++;
    cap[dr] = c;
    nod[dr] = b;
    next[dr] = ult[a];
    ult[a] = dr;
    dr++;
  }
  fclose(in);
  int p, nd, augm, ipoz, ip, nr = 0, poz;
  while(bfs(n)){
    poz = ult[n - 1];
    while(poz != -1){
      nd = nod[poz];
      ipoz = invs(poz);
      if(viz[nd] && cap[ipoz] - fol[ipoz] > 0){
        augm = INF;
        p = n - 1;
        prev[n - 1] = nd;
        sc[n - 1] = ipoz;
        while(p != 0){
          if(augm > cap[sc[p]] - fol[sc[p]])
            augm = cap[sc[p]] - fol[sc[p]];
          p = prev[p];
        }
        p = n - 1;
        while(p != 0){
          ip = invs(sc[p]);
          fol[sc[p]] += augm;
          fol[ip] -= augm;
          p = prev[p];
        }
      }
      poz = next[poz];
    }
  }
  for(i = 0; i < m; i++){
    if(fol[2 * i] = cap[2 * i] || fol[2 * i + 1] == cap[2 * i + 1]){
      cap[2 * i]++;
      cap[2 * i + 1]++;
      if(bfs(n)){
        crit[i] = 1;
        nr++;
      }
      cap[2 * i]--;
      cap[2 * i + 1]--;
    }
  }
  FILE *out = fopen("critice.out", "w");
  fprintf(out, "%d\n", nr);
  for(i = 0; i < m; i++)
    if(crit[i])
      fprintf(out, "%d\n", i + 1);
  fclose(out);
  return 0;
}