Cod sursa(job #1464579)

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

#define MAX_N 100000

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

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

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;
}