Cod sursa(job #1880424)

Utilizator remus88Neatu Remus Mihai remus88 Data 15 februarie 2017 19:03:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 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");

/* root[i] = radacina arborelui din care facce parte i */
int n, m, root[Nmax];

/* returneaza root din componenta conexa din care face parte x*/
int getroot(int x) {
  if(root[x] != x) {
    root[x] = getroot(root[x]);
  }
  return root[x];
}

void reunion(int x, int y)
{
  root[ getroot(y) ] = getroot(x);
}

int main()
{
     f >>n >> m;

     /* initializare - n multimi */
     for(int i = 1; i <= n; ++i) root[i] = i;

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