Cod sursa(job #2943047)

Utilizator maria-marianita.cucos@s.unibuc.roCucos Marianita [email protected] Data 20 noiembrie 2022 14:58:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int n, m;
vector<int> tata(100001);
vector<int> h(100001);

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


int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; i++)     // initializare
    {
        //fieacare nod incepe ca fiind propriul sau parinte
        tata[i] = 0;
        h[i] = 0;
    }

    for (int i = 1; i <= m; i++)
    {
        int cod, x, y;
        f >> cod >> x >> y;

        if (cod == 1)
        {
            int rx = find_parent(x);
            int ry = find_parent(y);

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

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