Cod sursa(job #1890881)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 23 februarie 2017 16:11:08
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>

#define MAX_N 100000

int p[MAX_N], h[MAX_N];

void init(int n) {
  for (int i = 0; i < n; ++i) {
    p[i] = i;
    h[i] = 1;
  }
}

int find(int x) {
  int r = x;
  while (p[r] != r) {
    r = p[r];
  }
  while (p[x] != r) {
    int tmp = p[x];
    p[x] = r;
    x = tmp;
  }
  return r;
}

void _union(int x, int y) {
  int rx = find(x), ry = find(y);
  if (rx != ry) {
    if (h[rx] > h[ry]) {
      p[ry] = rx;
    } else if (h[ry] > h[rx]) {
      p[rx] = ry;
    } else {
      p[rx] = ry;
      h[ry]++;
    }
  }
}

int main(void) {
  FILE *fin, *fout;
  int n, m, j, k, i, m1, m2;

  fin = fopen("disjoint.in", "r");
  fout = fopen("disjoint.out", "w");
  fscanf(fin, "%d%d", &n, &m);
  init(n);
  for (; m > 0; --m) {
    fscanf(fin, "%d%d%d", &i, &j, &k);
    m1 = find(j);
    m2 = find(k);
    if (i == 1) {
      _union(m1, m2);
    } else {
      fprintf(fout, "%s\n", m1 == m2 ? "DA" : "NU");
    }
  }
  fclose(fin);
  fclose(fout);

  return 0;
}