Cod sursa(job #2279288)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 9 noiembrie 2018 12:06:48
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int vector_tati[100005], inaltime_arbore[100005];
int n , m;

int  gaseste(int x)
{
    int r, y;

    r=x;
    //stabilesc radacina in nodul x
    //atata timp cat tatal radacinii este diferit de radacina
    while(vector_tati[r] != r )
        //radacina va fi inlocuita cu propriul sau tata
      r = vector_tati[r];
    //atata timp cat tatal lui x este diferit de x
    while( vector_tati[x] != x)
    {
        //urc in arbore iar x va lua valoarea tatalui sau
       //si urc tatal in arbore
        y = vector_tati[x];
        vector_tati[x] = r;
        x = y;
    }
    //la final, returnez radacina arborelui din care face parte x
    return r;
}
void uneste (int x, int y)
{
    //in cazul in care inaltimea lui x e mai mare decat cea a lui y, il unesc pe y de x

  if(inaltime_arbore[x]  > inaltime_arbore[y])
   vector_tati[y] = x;
    else vector_tati[x] = y;
//daca cele 2 inaltimi sunt egale, atunci cresc inaltimea unuia dintre arbori
    if(inaltime_arbore[x] == inaltime_arbore[y])
    inaltime_arbore[y] ++;
}
int main() {
  int n, m, x, y, cod;
  f >> n >> m;
  //initializez vectorul de tati cu valoare i
  //initializez fiecare inaltime al fiecarui arbore cu valoarea 1
  for( int i = 1; i <= n; i ++)
  {
      vector_tati [i] = i;
      inaltime_arbore [i] = 1;
  }
  for(int i = 1; i <= m; i++)
  {
      f >> cod >> x >> y;
//daca interogarea mea este de tipul 1, atunci unesc cele doua noduri prin radacinile lor si creez o radacina comuna
      if( cod == 1)
      {
         uneste( gaseste(x), gaseste(y));
      }
      //daca interogarea este de tipul 2, atunci daca radacina celor doua noduri este comuna
      // afisez da, altfel afisez nu
      else if( cod == 2)
      {
          if(gaseste(x) == gaseste(y) )
              g <<"da"<<endl;
              else g << "nu"<<endl;
      }
  }
  return 0;

}