Cod sursa(job #2946098)

Utilizator wowwow3Wow wow wowwow3 Data 24 noiembrie 2022 15:53:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 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;
    else {
        parent[element] = find_root(parent[element]);
        return parent[element];
    }
}


void union_of_partition (int left, int right){
    int left_rep = find_root(left);
    int right_rep = find_root(right);

    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;

    for (i = 1; i <= M; i++){
        fin >>  task;

        switch (task)
        {
        case 1:
            fin >>  j   >>  k;
            union_of_partition(j , k);
            break;
        
        case 2:
            fin >>  j   >>  k;
            if (find_root(j) == find_root(k))
                fout    <<  "DA\n";
            else
                fout    <<  "NU\n";
            break;
        }

    }

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

    return 0;
}