Cod sursa(job #720683)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 22 martie 2012 20:21:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<time.h>

#include<vector>
#include<algorithm>

const int knmax = 100005;
int nodes, qrys, dad[knmax];

void read(){
  assert(freopen("disjoint.in", "r", stdin) != NULL);

  scanf("%d%d", &nodes, &qrys);

  srand(time(NULL));
}

void init(){
  for(int i = 1; i <= nodes; ++i)
    dad[i] = i;

}

int root(int x){
  if(dad[x] == x)
    return x;

  return root(dad[x]);
}

bool query(int x, int y){
  if(root(x) == root(y))
    return true;
  return false;

}

void unite(int x, int y){
  int aux_x = root(x), aux_y = root(y);

  if(rand() % 2 == 0)
    dad[aux_x] = aux_y;
  else
    dad[aux_y] = aux_x;

}

void write(){
  assert(freopen("disjoint.out", "w", stdout) != NULL);

  int q_type, q_x, q_y;
  for(int i = 1; i <= qrys; ++i){
    scanf("%d%d%d", &q_type, &q_x, &q_y);

    if(q_type == 1)
      unite(q_x, q_y);
    else
      if(query(q_x, q_y))
        printf("DA\n");
      else
        printf("NU\n");
  }

}

int main(){
  read();
  init();
  write();
  return 0;
}