Cod sursa(job #2685206)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 16 decembrie 2020 12:36:17
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

constexpr auto max_n = 100005;

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n, m;
int parent[max_n];
int levels[max_n];

int get_parent(int node)
{
    auto crt_node = node;
    while (crt_node != parent[crt_node])
        crt_node = parent[crt_node];

    const auto root_parent = crt_node;

    while (node != parent[node])
    {
        crt_node = parent[node];
        parent[node] = root_parent;
        node = crt_node;
    }

    return root_parent;
}

void join_nodes(const int a, const int b)
{
    const auto a_parent = get_parent(a);
    const auto b_parent = get_parent(b);
    if (levels[a_parent] < levels[b_parent])
    {
        parent[a_parent] = b_parent;
        levels[b_parent]++;
    }
    else
    {
        parent[b_parent] = a_parent;
        levels[a_parent]++;
    }
}

bool query_nodes(const int a, const int b)
{
    return get_parent(a) == get_parent(b);
}

int main()
{
    fin >> n >> m;
    for (auto i = 1; i <= n; i++)
        parent[i] = i;

    for (auto i = 0; i < m; i++)
    {
        int cod, x, y;
        fin >> cod >> x >> y;
        switch (cod)
        {
        case 1:
            join_nodes(x, y);
            break;
        case 2:
            fout << (query_nodes(x, y) ? "DA" : "NU") << "\n";
            break;
        }
    }

    return 0;
}