Cod sursa(job #1118634)

Utilizator thebest001Neagu Rares Florian thebest001 Data 24 februarie 2014 12:22:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
using namespace std;
#define MAX 100001
int n, parent[MAX], grad[MAX];

int gaseste(int x) {
  //find root
  int r = x;
  while (parent[r] != r) r=parent[r];

  //compress everything
  while (parent[x] != x) {
    int aux=parent[x];
    parent[x]= r;
    x = aux;
  }
  return r;
}

void unite(int a, int b) {
  if (grad[a] > grad[b])
    parent[b]=a;
  else
    parent[a]=b;
  if (grad[a] == grad[b])
    grad[b]++;
}

int main() {
  freopen("disjoint.in", "r", stdin);
  freopen("disjoint.out", "w", stdout);
  int m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) {
    parent[i]=i;
    grad[i]=1;
  }
  for (int i = 1; i <= m; i++) {
    int x, a, b;
    scanf("%d %d %d", &x, &a, &b);
    if (x == 1) {
      unite(gaseste(a), gaseste(b));
    } else {
      if (gaseste(a) == gaseste(b)) {
        printf("DA\n");
      } else {
        printf("NU\n");
      }
    }
  }

  return 0;
}