Cod sursa(job #2938006)

Utilizator DragosG12Ghinea Dragos DragosG12 Data 11 noiembrie 2022 15:28:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include<fstream>
using namespace std;

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

//vector de elemente, in care indexu reprezinta elementu
//si valoarea este fie un alt element din multime fie radacina multimii atunci cand indexu = valoarea
int *multimi;
int *rankuri;

//radacina multimii spune multimea in care se afla
//asa ca mergem din element in element pana dam de radacina
//pentru a simplifica viitoare cautari, toate elementele vizitate vor primi valoarea radacinii
//O(logN)
int gaseste(int x){
    if(multimi[x]==x)
        return x;
    return multimi[x]=gaseste(multimi[x]);
}

//radacina unei multimi devine element in multimea altuia
void uneste(int x, int y){
    int m1 = gaseste(x);
    int m2 = gaseste(y);
    if(rankuri[m1]==rankuri[m2]){
        multimi[m1]=m2;
        rankuri[m1]++;
    }
    else if(rankuri[m1]>rankuri[m2]){
        multimi[m1]=m2;
    }
    else{
        multimi[m2]=m1;
    }
}

int main(){
    int n,m;
    fin>>n>>m;
    
    //initializam elementele, toate elementele sunt radacini initial
    multimi=new int[n+1];
    rankuri=new int[n+1];
    for(int i=1;i<=n;i++)
        multimi[i]=i, rankuri[i]=1;
        
    int cod,x,y;
    while(fin>>cod>>x>>y){
        if(cod==1)
            uneste(x,y);
        else{
            fout<<(gaseste(x)==gaseste(y)?"DA\n":"NU\n");
        }
    }

    return 0;
}

//complexitate timp: O(1) pentru unire O(log*N)~O(1) pentru gasire (conform indicatiilor de rezolvare)
//complexitate memorie: O(n)