Cod sursa(job #2019757)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 8 septembrie 2017 14:28:21
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#define DMAX 100002

using namespace std;

ifstream in("disjoint.in");
ofstream out("disjoint.out");

struct arbore{
  int tata;
  int inaltime;
}nod[DMAX];

int n, m;

void initializare(){
  for(int i = 1; i <= n; i++){
    nod[i].tata = i;
  }
}

int radacina(int plecNod){
  if(nod[plecNod].tata == plecNod){
    return plecNod;
  }else{
    return radacina(nod[plecNod].tata);
  }
}


void reuniune(int a, int b, int tataA, int tataB){
  if(nod[tataA].inaltime > nod[tataB].inaltime){
    nod[tataB].tata = tataA;
    nod[tataB].inaltime = 1 + nod[tataA].inaltime;
  }else{
    nod[tataA].tata = tataB;
    nod[tataA].inaltime = 1 + nod[tataB].inaltime;
  }
}

void rezolvare(int tip, int a, int b){
  int tataA, tataB;
  tataA = radacina(a);
  tataB = radacina(b);
  if(tip == 1){
    reuniune(a, b, tataA, tataB);
  }else{
    if(tataA == tataB){
      out << "DA\n";
    }
    else{
      out << "NU\n";
    }
  }
}

void citire(int &tip, int &a, int &b){
  in >> tip >> a >> b;
}

int main(){
  in >> n >> m;
  initializare();
  for(int i = 1; i <= m; i++){
    int tip, a, b;
    citire(tip, a, b);
    rezolvare(tip, a, b);
  }
  return 0;
}