Cod sursa(job #2939170)

Utilizator maria.neagaNeaga-Budoiu Maria maria.neaga Data 13 noiembrie 2022 10:31:38
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>


using namespace std;

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

vector <int> tata, dimArbore;

int n, m;

int aflaTata(int nod) //fct. care calculeaza rad. arborelui in care se afla nodul
{
    if(nod == tata[nod])
        return nod;

    return tata[nod] = aflaTata(tata[nod]);

}

int main()
{
    int cod, x, y;

    in>>n>>m;

    tata.resize(n+1);
    dimArbore.resize(n+1);

    for(int i=1; i<=n; i++)
    {
        ////in fiecare arbore se afla un singur nod, rad., deci tatal rad. e rad. si dim arborelui e 1
        tata[i] = i;
        dimArbore[i] = 1;

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

        x = aflaTata(x); //aflu radacina arborelui in care se afla x
        y = aflaTata(y); //aflu radacina arborelui in care se afla y

        if(cod == 1)
        {

            if(x != y) //daca nu se afla deja in acc. arbore
            {
                //lipesc arborele mai mic de cel mai mare

                if(dimArbore[x] < dimArbore[y])
                {
                    tata[y] = x;
                    dimArbore[x] += dimArbore[y];
                }

                else
                {
                    tata[x] = y;
                    dimArbore[y] += dimArbore[x];
                }
            }

        }

        else if(cod == 2)
        {

            if(x == y) //daca arborii din care fac parte au acc. rad., sunt acc. arbore
                out<<"DA\n";
            else
                out<<"NU\n";
        }


    }

        return 0;
}