Cod sursa(job #2948671)

Utilizator bbia17Baicoianu Bianca bbia17 Data 27 noiembrie 2022 23:05:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
//Complexitatea este O(log*n)

//IDEE
//- reprezentam fiecare multime ca pe un arbore cu radacina
//Pentru operatie de tip 2 
//      -parcurgem arborele in sus din ambele elemente 
//      si daca la sfarsit ajungem in aceeasi radacina atunci elementele noastre se afla in aceeasi multime
//Pentru operatie de tip 1 
//      -determinam radacinile celor 2 arbori si le conectam printr-o muchie.


#include <fstream>
#include <vector>

using namespace std;

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

vector <int>tata;

//merg in sus pe arbore pana gasesc radacina
int Rad(int x){  
    if(tata[x] == 0)
        return x;
    return tata[x] = Rad(tata[x]);
}

int main(){
    int n, m, cod, x, y;
    f >> n >> m;
    tata.resize(n+1, 0);

    for(int i = 0; i < m; i++){
        f >> cod >> x >> y;

        if(cod == 1){
            //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
            int radacinaX = Rad(x);
            int radacinaY = Rad(y);

            tata[radacinaX] = radacinaY;
        }
        else
        //verific daca radacina arborilor in care se afla x respectiv y este egala
            if(Rad(x) == Rad(y))
                g<<"DA\n";
            else
                g<<"NU\n";
    }

    return 0;
}