Cod sursa(job #2950339)

Utilizator tm123321teo mihailescu tm123321 Data 3 decembrie 2022 15:28:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n,m;

int tata[100002];   // O(O(m log n))

int x,y,code;

int gasire_radacina (int x) // gasirea radacinii cu vectorul de tati
{
    int radacina = x;


    while (tata[radacina] > 0)
    {
        radacina = tata[radacina];
    }

    while (tata[x] > 0)
    {
        tata[x] = radacina;
        x = tata[x];
    }
    return radacina;

}

void reuniune_grafuri (int x, int y) // reunim doua grafuri prin atribuirea tatalui lui y valoarea x
{
    tata[gasire_radacina(y)] = gasire_radacina(x);
}

bool verif (int x, int y) // verificam daca doua noduri sunt in acelasi graf
{
    if (gasire_radacina(x) == gasire_radacina(y))
        return true;
    else
        return false;
}

int main ()
{

    f >> n >> m;


    for (int i=1; i<=n; i++) //pt fiecare nod parintele sau e 0 pt ca fiecare nod i e radacina
        tata[i] = -1;

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

        if (code == 1)
            reuniune_grafuri (x,y);
        else if (verif(x,y))
            g << "DA\n";
        else
            g << "NU\n";
    }

    return 0;
}