Cod sursa(job #1657166)

Utilizator hrazvanHarsan Razvan hrazvan Data 20 martie 2016 11:18:27
Problema Radiatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <stdio.h>
#include <string.h>
#define MAXN 15000
#define MAXM 30000
#define MAXLG 13
int x[MAXM], y[MAXM], z[MAXM], pnt[MAXM];
char bun[MAXN];
int ut[MAXN], nd[2 * MAXN], ct[2 * MAXN], nxt[2 * MAXN], dr;
int anc[MAXLG + 1][MAXN], cost[MAXLG + 1][MAXN], ad[MAXN];
int tata[MAXN];

inline int max2(int a, int b){
  return a > b ? a : b;
}

int stata(int x){
  if(tata[x] == -1)
    return x;
  int r = stata(tata[x]);
  tata[x] = r;
  return r;
}

inline char unesc(int a, int b){
  if(stata(a) != stata(b)){
    tata[stata(a)] = stata(b);
    return 1;
  }
  return 0;
}

inline void add(int x, int y, int z){
  nd[dr] = y;
  nxt[dr] = ut[x];
  ct[dr] = z;
  ut[x] = dr;
  dr++;
}

void qs(int st, int dr){
  int i = st, j = dr, piv = z[pnt[(st + dr) / 2]], aux;
  while(i <= j){
    while(z[pnt[i]] < piv)
      i++;
    while(z[pnt[j]] > piv)
      j--;
    if(i <= j){
      aux = pnt[i];  pnt[i] = pnt[j];  pnt[j] = aux;
      i++;  j--;
    }
  }
  if(st < j)
    qs(st, j);
  if(i < dr)
    qs(i, dr);
}

void gtata(int x, int tata, int adanc){
  ad[x] = adanc;
  int poz = ut[x];
  while(poz != -1){
    if(nd[poz] != tata){
      anc[0][nd[poz]] = x;
      cost[0][nd[poz]] = ct[poz];
      gtata(nd[poz], x, adanc + 1);
    }
    poz = nxt[poz];
  }
}

inline void precalc(int n){
  int i, j;
  for(i = 1; i <= MAXLG; i++){
    for(j = 0; j < n; j++){
      if(anc[i - 1][j] == -1){
        anc[i][j] = -1;
        cost[i][j] = cost[i - 1][j];
      }
      else{
        anc[i][j] = anc[i - 1][anc[i - 1][j]];
        cost[i][j] = max2(cost[i - 1][j], cost[i - 1][anc[i - 1][j]]);
      }
    }
  }
}
inline int solve(int a, int b){
  int aux, i, rez = 0;
  if(ad[a] < ad[b]){
    aux = a;  a = b;  b = aux;
  }
  for(i = MAXLG; i >= 0; i--){
    if(ad[a] - (1 << i) >= ad[b]){
      rez = max2(rez, cost[i][a]);
      a = anc[i][a];
    }
  }
  for(i = MAXLG; i >= 0; i--){
    if(anc[i][a] != anc[i][b]){
      rez = max2(rez, max2(cost[i][a], cost[i][b]));
      a = anc[i][a];
      b = anc[i][b];
    }
  }
  if(a != b)
    rez = max2(rez, max2(cost[0][a], cost[0][b]));
  return rez;
}

int main(){
  FILE *in = fopen("radiatie.in", "r");
  int n, k, m, i;
  fscanf(in, "%d%d%d", &n, &m, &k);
  memset(tata, -1, sizeof tata);
  for(i = 0; i < m; i++){
    fscanf(in, "%d%d%d", &x[i], &y[i], &z[i]);
    x[i]--;  y[i]--;
    pnt[i] = i;
  }
  qs(0, m - 1);
  memset(ut, -1, sizeof ut);
  for(i = 0; i < m; i++){
    if(unesc(x[pnt[i]], y[pnt[i]])){
      add(x[pnt[i]], y[pnt[i]], z[pnt[i]]);
      add(y[pnt[i]], x[pnt[i]], z[pnt[i]]);
    }
  }
  memset(anc[0], -1, sizeof anc[0]);
  for(i = 0; i < n; i++){
    if(anc[0][i] == -1)
      gtata(i, -1, 0);
  }
  precalc(n);
  FILE *out = fopen("radiatie.out", "w");
  int a, b;
  for(i = 0; i < k; i++){
    fscanf(in, "%d%d", &a, &b);
    a--;  b--;
    fprintf(out, "%d\n", solve(a, b));
  }
  fclose(in);
  fclose(out);
  return 0;
}