Cod sursa(job #2441780)

Utilizator mirceaisherebina mircea mirceaishere Data 21 iulie 2019 00:34:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int n, m, i, j, x, y, t[100002], k, rx, ry;

int radacina(int nod){
    while(t[nod]>0){
        nod=t[nod];
    }
    int r=nod;
    while(t[nod]>0){
        int aux=nod;
        nod=t[nod];
        t[aux]=r;
    }
    return r;
}

int main(){
    fin>>n>>m;
    /// initializam cu -1 vectorul reprezentand si gradul grupei careia ii sunt radacini
    for(i=1; i<=n; i++){
        t[i]=-1;
    }
    for(i=1; i<=m; i++){
        fin>>k>>x>>y;
        rx=radacina(x);
        ry=radacina(y);
        if(k==1){
            /// reunim multimile ce contin elementele x si y adica tatal radacinii celui cu mai putini
            /// subordonati devine radacina celeilalte, iar tatal radacinii celelalte se mareste cu nodurile obtinute
            if(t[rx]<t[ry]){
                /// numerele sunt negative asa ca < este de fapt > insemnand ca rx are gradul mai mare
                t[rx]+=t[ry];
                t[ry]=rx;
            }else{
                t[ry]+=t[rx];
                t[rx]=ry;
            }
        }else{
            /// verificam daca radacinile sunt egale
            if(rx==ry){
                fout<<"DA"<<"\n";
            }else{
                fout<<"NU"<<"\n";
            }
        }
    }
}