Cod sursa(job #1535756)

Utilizator hrazvanHarsan Razvan hrazvan Data 25 noiembrie 2015 09:25:56
Problema Critice Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.64 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 viz1[MAXN], viz2[MAXN], crit[MAXM];

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

inline char bfs(char *viz, int start, int fin, int n){
  int nd, st = 0, dr = 1, poz;
  q[0] = start;
  viz[start] = 1;
  while(!viz[fin] && st < dr){
    nd = q[st];
    st++;
    poz = ult[nd];
    while(poz != -1){
      if(!viz[nod[poz]]){
        if((start == 0 && cap[poz] > fol[poz]) || (start == n - 1 && 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[fin];
}

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, poz;
  memset(viz1, 0, sizeof viz1);
  while(bfs(viz1, 0, n - 1, n)){
    poz = ult[n - 1];
    while(poz != -1){
      nd = nod[poz];
      ipoz = invs(poz);
      if(viz1[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];
    }
    memset(viz1, 0, sizeof viz1);
  }
  memset(viz1, 0, sizeof viz1);
  bfs(viz1, 0, n - 1, n);
  memset(viz2, 0, sizeof viz2);
  bfs(viz2, n - 1, 0, n);
  for(i = 0; i < n; i++){
    poz = ult[i];
    while(poz != -1){
      if(((viz1[i] && viz2[nod[poz]]) || (viz2[i] & viz1[nod[poz]])) && (fol[poz] == cap[poz] || fol[invs(poz)] == cap[invs(poz)]))
        crit[poz / 2] = 1;
      poz = next[poz];
    }
  }
  int nr = 0;
  for(i = 0; i < m; i++)
    nr += crit[i];
  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;
}