Cod sursa(job #2552455)

Utilizator tilted_emilian09Buciu Emilian tilted_emilian09 Data 20 februarie 2020 20:50:28
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector <unsigned int> T, Rang;

unsigned int radacina(unsigned int x)
{
    unsigned int R; // radacina
    unsigned int y; // aux in care retin tatal precedent al lui x (inainte de a-l lega direct la radacina)

    for (R = x; T[R] != R; R = T[R]); //acum R este radacina arborelui

    //vreau sa plec de la x catre R, iar pe drum sa leg fiecare nod direct la radacina

    while (T[x] != x)
    {
        y = T[x];

        T[x] = R;

        x = y;
    }

    return R;
}

void unire(unsigned int x, unsigned int y)
{
    if (Rang[x] > Rang[y])
        T[y] = x;
    else
        T[x] = y;

    if (Rang[x] == Rang[y])
        Rang[y]++;
}

int main()
{
    unsigned int n, m;

    f >> n >> m;

    T = Rang = vector <unsigned int> (n + 1, 0);

    for (unsigned int i = 1; i <= n; i++)
    {
        T[i] = i;
        Rang[i] = 1;
    }

    for (unsigned int i = 1; i <= m; i++)
    {
        unsigned int cod, x, y;

        f >> cod >> x >> y;

        if (cod == 1)
        {
            unire(x, y);
        }
        else
            if (cod == 2)
            {
                if (radacina(x) != radacina(y))
                    g << "NU" << '\n';
                else
                    g << "DA" << '\n';
            }
    }

    return 0;
}