Cod sursa(job #2938957)

Utilizator mihairazvan03Dana Mihai mihairazvan03 Data 12 noiembrie 2022 19:49:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <vector>

//facem un vector de tati pt fiecare nod, tatal unui nod fiind "seful" multimii din care face parte nodul respectiv. pt operatia 1 daca nu sunt in aceeasi multime (adica au tati diferiti) ii
//schimbam tatal celui care apartine multimii cu dimensiunea mai mica dintre ei. pt op2 verificam daca au sau nu acelasi tata

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");

int multimi, operatii;
vector<int> dad, sizee;

int root(int nod)
{
    if(nod == dad[nod])
        return nod;

    int newDad = root(dad[nod]);
    dad[nod] = newDad;
    return newDad;
}

void op1(int nod1, int nod2)
{
    nod1 = root(nod1);
    nod2 = root(nod2);

    if(nod1 != nod2)        //daca sunt egala inseamna ca sunt deja in aceeasi multime si nu se intampla nimic
    {
        if(sizee[nod1] < sizee[nod2])
        {
            dad[nod1] = nod2;
            sizee[nod2] += sizee[nod1];
        }
        else
        {
            dad[nod2] = nod1;
            sizee[nod1] += sizee[nod2];
        }
    }
}

int main()
{
    int op, nod1, nod2, i;

    in >> multimi >> operatii;
    dad.resize(multimi + 1);
    sizee.resize(multimi + 1, 1);

    for(i = 1; i <= multimi; i++)
        dad[i] = i;

    for(i = 1; i <= operatii; i++)
    {
        in >> op >> nod1 >> nod2;

        if(op == 1)
            op1(nod1, nod2);
        else
        {
            if(root(nod1) == root(nod2))
                out << "DA" << '\n';
            else
                out << "NU" << '\n';
        }
    }
}