Cod sursa(job #3175020)

Utilizator PetraPetra Hedesiu Petra Data 25 noiembrie 2023 11:34:34
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int n, m, dad[NMAX], rang[NMAX]; /// dad[i] = tatal (ascendentul direct) i in arbore

int do_find(int nod)
{
    if (nod != dad[nod])
    {
        int repr = do_find(dad[nod]);
        dad[nod] = repr;
        return repr;
    }
    else return nod;
}

void do_union(int x, int y)
{
    if (rang[x] < rang[y])
        dad[x] = y;
    else if (rang[x] > rang[y])
        dad[y] = x;
    else if (rang[x] == rang[y])
    {
        dad[x] = y;
        rang[y]++;
    }
}

int main()
{
    fin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        dad[i] = i;
        rang[i] = 1;
    }

    for(int i = 1; i <= m; i++)
    {
        int c, x, y;
        fin >> c >> x >> y;

        int repr_x = do_find(x);
        int repr_y = do_find(y);

        if(c == 1)
        {
            /// reuniunea lui x cu y
            do_union(x, y);
        }
        else if(c == 2)
        {
            if(repr_x == repr_y)
                fout << "DA\n";
            else fout << "NU\n";
        }
    }
    return 0;
}