Cod sursa(job #1540457)

Utilizator tudorcomanTudor Coman tudorcoman Data 2 decembrie 2015 20:12:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>

const int maxN = 100000;
int father[maxN + 1];
int grad[maxN + 1];

void init(int n) {
  for(register int i = 1; i <= n; ++ i) {
    father[i] = i;
    grad[i] = 1;
  }
}

int root(int node) {
  int x = node;
  while (x != father[x])
    x = father[x];
  int y = node;
  while (y != father[y]) {
    int _y = y;
    y = father[y];
    father[_y] = x;
  }
  return x;
}

bool areJoined(int fnode, int snode) {
  return root(fnode) == root(snode);
}

void join(int fnode, int snode) {
  fnode = root(fnode);
  snode = root(snode);
  if (fnode != snode) {
  	 if (grad[fnode] < grad[snode]) {
      father[fnode] = snode;
      grad[snode] += grad[fnode];
    } else {
      father[snode] = fnode;
      grad[fnode] += grad[snode];
    }
  }
}

int main() {
  freopen("disjoint.in", "r", stdin);
  freopen("disjoint.out", "w", stdout);
  int N, M;
  scanf("%d %d", &N, &M);
  init(N);
  while(M --) {
    int op, a, b;
    scanf("%d %d %d", &op, &a, &b);
    if(op == 1)
      join(a, b);
    else
      printf("%s\n", areJoined(a, b) ? "DA" : "NU");
  }
  return 0;
}