Cod sursa(job #2083151)

Utilizator VoineaAndreiVoinea Ioan-Andrei VoineaAndrei Data 7 decembrie 2017 05:46:29
Problema Paduri de multimi disjuncte Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<bits/stdc++.h>
#define nMax 100000
using namespace std;

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

int tata[nMax], nivel[nMax];

//cauta din tata in tata pana in radacina
int gaseste_tata(int nod){
    if(nod != tata[nod]){
        tata[nod] = gaseste_tata(tata[nod]);
    }
    return tata[nod];
}


//reuneste ramura lui x cu ramura lui y
void reuneste(int x, int y){

    //unim ramurile la baza
    x = gaseste_tata(x);
    y = gaseste_tata(y);

    //ramura mai mica este pusa in continuarea ramurei mai mari
    if(nivel[x] > nivel[y]){
        nivel[y] += nivel[x];
        tata[y] = x;
        }
    else {
        nivel[x] += nivel[y];
        tata[x] = y;
         }

}

// daca doua elemente au aceeasi radacina atunci sunt unite
bool sunt_unite(int x, int y){
    x = gaseste_tata(x);
    y = gaseste_tata(y);
    return x == y;
}

int main(){
    int n,q;
    f>>n>>q;

    //face fiecare element sa fie propriul sau tata si seteaza nivelul la 1
    for(int i=1;i<=n;++i){
        tata[i]=i;
        nivel[i]=1;
    }

    for(int i=1;i<=q;++i){
        int cod,x,y;
        f>>cod>>x>>y;
        if(cod==1) reuneste(x, y);  //reuneste 2 ramuri
        else
            if(sunt_unite(x, y)) g<<"DA"<<'\n';
            else g<<"NU"<<'\n';
    }
}