Cod sursa(job #2966146)

Utilizator tudorcioc5Cioc Tudor tudorcioc5 Data 16 ianuarie 2023 19:44:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.28 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;


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

int task, M, N, i, j, k;

vector <int> parent (100001, -1);
vector <int> rank_of_element (100001 , 0);


int find_root(int element){
    if (parent[element] == -1)
        return element;                                     //atunci cand cautam radicina
    else {                                                  //updatam pentru elementul dorit
        parent[element] = find_root(parent[element]);       //care este radacina(asta in cazul in care
        return parent[element];                             //nu stiam deja)
    }
}


void union_of_partition (int left, int right){
    int left_rep = find_root(left);                         //rank-ul fiecarui element se
    int right_rep = find_root(right);                       //refera la cate noduri sunt in
                                                            //arborele cu radacina respectiva
                                                            //(doar radacina poate sa aiba rank)

    if (rank_of_element[left_rep] < rank_of_element[right_rep])
        parent[left_rep] = right_rep;

    if (rank_of_element[left_rep] > rank_of_element[right_rep])
        parent[right_rep] = left_rep;

    if (rank_of_element[left_rep] == rank_of_element[right_rep]){
        parent[left_rep] = right_rep;
        rank_of_element[left_rep]++;
    }

}


int main (){
    fin >>  N   >>  M;                  //citim numarul de multimi
                                        //si numarul de operatii



    for (i = 1; i <= M; i++){           //citim tipul operatiei
        fin >>  task;

        //reprezentam fiecare multime ca un arbore cu radacina

        switch (task)
        {
        case 1:
            fin >>  j   >>  k;
            union_of_partition(j , k);      //reunim multimile
            break;
        
        case 2:
            fin >>  j   >>  k;
            if (find_root(j) == find_root(k))       //cautam radacina multimilor si vedem daca e aceeasi
                fout    <<  "DA\n";
            else
                fout    <<  "NU\n";
            break;
        }

    }

    fin.close();
    fout.close();

    return 0;
}