Cod sursa(job #2577016)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 7 martie 2020 22:47:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#include <vector>

using namespace std;
vector<int> parent, height;

int whos_your_parent(int k) {
  if (parent[k] != k)
    parent[k] = whos_your_parent(parent[k]);
  return parent[k];
}

void unionSets(int left, int right)
{
  left = whos_your_parent(left);
  right = whos_your_parent(right);

  if (height[left] < height[right])
    swap(left, right);
  // invariant: height[left] >= height[right]
  parent[right] = left;
  height[left] += (height[left] == height[right]);
}

int main()
{
  freopen("disjoint.in", "r", stdin);
  freopen("disjoint.out", "w", stdout);

  int N, M;
  scanf("%d%d", &N, &M);
  parent.resize(N + 1);
  height.resize(N + 1);
  
  for (int i = 0; i <= N; ++i)
    parent[i] = i;

  for (int i = 0; i < M; ++i) {
    int op, x, y;
    scanf("%d%d%d", &op, &x, &y);
    if (op == 1) {
      unionSets(x, y);
      continue;
    }
    if (whos_your_parent(x) == whos_your_parent(y))
      printf("DA\n");
    else
      printf("NU\n");
  }
  
  return 0;
}