Cod sursa(job #1464578)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 23 iulie 2015 22:08:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>

#define MAX_N 100000

int father[MAX_N];
int height[MAX_N];

static inline int getFather(int x) {
  int r = x;
  while (father[r] != r) {
    r = father[r];
  }
  while (father[x] != r) {
    int tmp = father[x];
    father[x] = r;
    x = tmp;
  }
  return r;
}

int main(void) {
  FILE *f = fopen("disjoint.in", "r");
  FILE *g = fopen("disjoint.out", "w");
  int n, m;
  int a, b;
  char opType;

  fscanf(f, "%d%d\n", &n, &m);
  for (int i = 0; i < n; i++) {
    father[i] = i;
    height[i] = 1;
  }
  for (int i = 0; i < m; i++) {
    opType = fgetc(f);

    fscanf(f, "%d%d\n", &a, &b);

    a = getFather(a - 1);
    b = getFather(b - 1);

    if (opType == '1') {
      if (a != b) {
        if (height[a] > height[b]) {
          height[a]++;
          father[b] = a;
        } else {
          height[b]++;
          father[a] = b;
        }
      }
    } else {
      fputs((a == b) ? "DA\n" : "NU\n", g);
    }
  }
  fclose(f);
  fclose(g);
  return 0;
}