Cod sursa(job #2588922)

Utilizator tudorcioc5Cioc Tudor tudorcioc5 Data 25 martie 2020 16:23:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;


ifstream fin;
ofstream fout;

int task, number_of_tasks, n, i, j, k;

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

void create_disjoint(){
    for (i=1; i<=n; i++)
        parent[i] = i;
}

int find_element(int element){
    if (parent[element] == element)
        return element;
    else {
        parent[element] = find_element(parent[element]);
        return parent[element];
    }
}


void union_of_partition (int left, int right){
    int left_rep = find_element(left);
    int right_rep = find_element(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 (void){
    fin.open("disjoint.in");
    fout.open("disjoint.out");
    fin>>n>>number_of_tasks;

    create_disjoint();

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

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

    }

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

    return 0;
}