Cod sursa(job #2944416)

Utilizator gizzehhhAsavoaei Bianca Gabriela gizzehhh Data 22 noiembrie 2022 15:29:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#define N 100005

using namespace std;

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

int tata[N], rang[N];
int n, m;

int CautareRad(int nod)
{
    int rad = nod;
    while(tata[rad] != rad)
        rad = tata[rad];

    tata[nod] = rad;
    return rad;
}

void Reunire(int nod1, int nod2)
{
    int radacina1, radacina2;

    radacina1 = CautareRad(nod1);
    radacina2 = CautareRad(nod2);

    /// la arborele cu radacina mai mica "aducem celalalt arbore"
    if(radacina1 == radacina2)
        return;

    if(rang[radacina1] < rang[radacina2])
    {
        tata[radacina1] = radacina2;
        rang[radacina2] = rang[radacina2] + rang[radacina1];
    }

    else
    {
        tata[radacina2] = radacina1;
        rang[radacina1] = rang[radacina1] + rang[radacina2];
    }
}

void Afisare(int nod1, int nod2)
{
    /// daca arborii in care se afla cele 2 noduri au radacina egala
    if(CautareRad(nod1) == CautareRad(nod2))
        fout <<"DA";
    else
        fout <<"NU";

    fout <<"\n";
}

void Citire()
{
    fin >> n >> m;

    for(int i=1; i <=n; i++)
    {
        /// fiecare nod are ca tata pe el insusi
        tata[i] = i;
        rang[i] = 1;
    }

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


        if(tip == 1)
            Reunire(x,y);

        if(tip == 2)/// daca radacina arborelui unde se afla x = radacina arborelui unde se afla y
            Afisare(x,y);
    }

}

int main()
{
    Citire();
    return 0;
}