Cod sursa(job #2942024)

Utilizator BrioflatorBalescu Alexandru Brioflator Data 18 noiembrie 2022 19:50:56
Problema Paduri de multimi disjuncte Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

int n, m;
vector<int> parents(100001);
vector<int> rang(100001);

// Gaseste parintele unui nod, facand in acelasi timp si compresia drumului.
int find_parent(int x)
{
    //este radacina
    if (parents[x] == x)
    {
        return x;
    }
    //repetam cu tatal nodului pana ajungem la radacina
    return parents[x] = find_parent(parents[x]);
}

//legam arborele mai mic de cel mai mare
void merge_subsets(int x, int y)
{
    int rx = find_parent(x);
    int ry = find_parent(y);

    // daca arborele care l contine pe y e mai mic, atunci il atasam de arborele mai mare, anume ce l care l contine pe x
    if (rang[rx] > rang[ry])
        {
                // actualizam parintele arborelui y (cel mai mic) cu parintele arborelui lui x (cel mai mare)
                parents[ry] = rx;
                //modificam rangul/inaltimea arborelui mai mare
                rang[rx] += rang[ry];
        }
    else
        {
            // actualizam parintele arborelui x (cel mai mic) cu parintele arborelui lui y (cel mai mare)
            parents[rx] = ry;
            //modificam rangul/inaltimea arborelui mai mare
            rang[ry] += rang[rx];
        }
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        //fieacare nod incepe ca fiind propriul parinte
        //parent[1] = 2 inseamna ca 2 e parintele lui 1
        parents[i] = i;
        rang[i] = 1;
    }
    for (int i = 1; i <= m; i++)
    {
        //citirea datelor
        int cod, x, y;
        fin >> cod >> x >> y;

        //reuniune
        if (cod == 1)   merge_subsets(x,y);
        else
        {
            //gasim parintele/radacina pentru fiecare element
            int rx = find_parent(x);
            int ry = find_parent(y);

            //daca au acelasi parinte inseamna ca fac parte din aceeasi multime/subset
            if (rx == ry) fout << "DA"<<endl;
                else      fout << "NU"<<endl;
        }
    }
    return 0;
}