Cod sursa(job #2569293)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 4 martie 2020 11:46:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100000;
int N, M, p, x, y, t[NMAX + 5], r[NMAX + 5];

int GetParent(int nod)
{
    int radacina = nod, copie_nod = nod;
    while (t[nod] != nod)
    {
        radacina = t[nod];
        nod = radacina;
    }
    while (t[copie_nod] != copie_nod)
    {
        int aux = t[copie_nod];
        t[copie_nod] = radacina;
        copie_nod = aux;
    }
    return radacina;
}

void Unite(int nod1, int nod2)
{
    int parent1 = GetParent(nod1);
    int parent2 = GetParent(nod2);
    if (parent1 == parent2)
    {
        return;
    }
    if (r[parent1] > r[parent2])
    {
        t[parent2] = parent1;
    }
    else if (r[parent1] < r[parent2])
    {
        t[parent1] = parent2;
    }
    else
    {
        t[parent1] = parent2;
        r[parent1]++;
    }
}

int main()
{
    fin >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        t[i] = i;
    }
    while (M--)
    {
        fin >> p >> x >> y;
        if (p == 1)
        {
            Unite(x, y);
        }
        else
        {
            if (GetParent(x) == GetParent(y))
            {
                fout << "DA\n";
            }
            else
            {
                fout << "NU\n";
            }
        }
    }
    fin.close();
    fout.close();
    return 0;
}