Cod sursa(job #2948147)

Utilizator maria-marianita.cucos@s.unibuc.roCucos Marianita [email protected] Data 27 noiembrie 2022 12:33:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 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 f acelasi timp si compresia drumului.
int find_parent(int x)
{
    //este radacina
    if (tata[x] == 0)
    {
        return x;
    }
    //repetam pana ajungem la radacina
    return tata[x] = find_parent(tata[x]);
}


int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; i++)     // initializare
    {
        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 nod2 e mai mic, atunci il atasam de arborele mai mare, anume cel care il contine pe nod1
            // daca....
            if (h[rx] > h[ry])
            {
                // actualizam parintele arborelui nod2 (cel mai mic) cu parintele arborelui lui nod1 (cel mai mare)
                tata[ry] = rx;
                //inaltimea nu se actualizeaza
            }
            else
            {
                tata[rx] = ry;
                if(h[rx]==h[ry]) // f cazul f care au inaltimea egala
                    h[ry]=h[ry]+1; // actualizam inaltimea
            }
        }
        else
        {   // verificam daca nod1 si nod2 se afla f aceeasi multime
            int rx = find_parent(x);
            int ry = find_parent(y);

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