Cod sursa(job #3218464)

Utilizator Cezar_RusuCezar Rusu Cezar_Rusu Data 27 martie 2024 11:37:04
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>

using namespace std;

FILE *input, *output;

#define NMAX 100002

int T[NMAX], H[NMAX];

void Union(int x, int y) {
  if (H[x] > H[y]) T[y] = x;
  else if (H[x] < H[y]) T[x] = y;
  else {
    T[y] = x;
    ++H[x];
  }
}

int Find(int x) {
  if (T[x] == 0) return x;
  T[x] = Find(T[x]);
  return T[x];
}

int n, m;

int main(void) { int i;
	input = fopen("disjoint.in", "r"), output = fopen("disjoint.out", "w");

	(void)fscanf(input, "%d %d", &n, &m);
  {
    int c, x, y, rx, ry;
    for (i = 1; i <= m; ++i) {
      (void)fscanf(input, "%d %d %d", &c, &x, &y);

      rx = Find(x);
      ry = Find(y);

      if (c == 1) {
        Union(rx, ry);
      } else {
        (void)fprintf(output, "%s\n", (rx == ry) ? "DA" : "NU");
      }

    }
  }

	fclose(output);
	return 0;
}