Cod sursa(job #2679420)

Utilizator starduststardust stardust Data 30 noiembrie 2020 15:36:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <vector>

using namespace std;

int n, m;
vector<int> r;
vector<int> p;

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

int get(int node)
{
    while (p[node] != node)
        node = p[node];

    return node;
}

void makeUnion(int a, int b)
{
    a = get(a);
    b = get(b);

    if (r[a] == r[b])
        r[a]++;

    if (r[a] > r[b])
        p[b] = a;
    else
        p[a] = b;
}

int main()
{
    in >> n >> m;
    int x, y, z;
    r.push_back(0);
    p.push_back(0);
    for (int i = 1; i <= n; i++)
    {
        r.push_back(0);
        p.push_back(i);
    }
    for (int i = 0; i < m; i++)
    {
        in >> x >> y >> z;
        if (x == 1)
            makeUnion(y, z);
        else
        {
            if (get(y) == get(z))
                out << "DA\n";
            else
                out << "NU\n";
        }
    }

    return 0;
}