Cod sursa(job #2942033)

Utilizator BrioflatorBalescu Alexandru Brioflator Data 18 noiembrie 2022 20:00:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 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]);
}


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++)
    {
        int cod, x, y;
        fin >> cod >> x >> y;

        //legam arborele mai mic de cel mai mare
        if (cod == 1)
        {
            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
                {
                    parents[rx] = ry;
                    rang[ry] += rang[rx];
                }
        }
        else
        {
            int rx = find_parent(x);
            int ry = find_parent(y);

            if (rx == ry) fout << "DA\n";
                else      fout << "NU\n";
        }
    }
    return 0;
}