Cod sursa(job #2966148)

Utilizator tudorcioc5Cioc Tudor tudorcioc5 Data 16 ianuarie 2023 19:45:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 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);                         
    int right_rep = find_root(right);                      

    parent[left_rep] = right_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;
}