Cod sursa(job #1435679)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 14 mai 2015 01:02:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
// Paduri de multimi disjuncte - O(log*N) <=5
// op 1  - O(1) - reuneste multimile in care se afla x si y  (din multimi diferite)
// op 2  - O(log*N) - sa se spuna daca x si y sunt in aceeasi mutlime
#include <fstream>
#define Nmax 100099

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

/* T[i] = radacina arborelui din care facce parte i */
int N, M, T[Nmax], rang[Nmax];

/* returneaza grupa din care face parte x
  numele grupei este numele tatalui arborelui */

int gr(int x)
{
    int R, y;
 
    //merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
    for (R = x; T[R] != R; R = T[R]);
 
    //aplic compresia drumurilor
    for (; T[x] != x;)
    {
        y = T[x];
        T[x] = R;
        x = y;
    }
    return R;
}
 
void reunion(const int& x, const int& y){
  /* T[gr(x)] = gr(y); */
  
  int a = gr(x), b = gr(y);
  if (rang[a] > rang[b]) {
    T[b] = T[a];
  } else {
    T[a] = T[b];
  }
  if (rang[a] == rang[b]) rang[b]++; 
}


 

int main()
{
     f >>N >> M;

     /* initializare - N multimi */
     for(int i = 1; i <= N; ++i) T[i] = i , rang[i] = 1;

     for(int i = 1; i <= M; ++i)
     {
          int op,x,y;
          f >> op >> x >> y;
          if(op == 1) {
            reunion(x,y);
            continue;
          }
          if(op == 2) {
            if(gr(x) == gr(y)) g<<"DA\n";
                         else  g<<"NU\n";
          }
     }
     f.close();g.close();
     return 0;
}