Cod sursa(job #2514357)

Utilizator GBearUrsu Ianis-Vlad GBear Data 25 decembrie 2019 15:38:12
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;

#define MAX_N 100000 + 1

int parinte[MAX_N], marime_arbore[MAX_N];

void initializare_padure(int N)
{
    for(int i = 1; i <= N; ++i)
    {
        parinte[i] = i;

        marime_arbore[i] = 1;
    }

    return;
}


int gaseste_radacina(int nod)
{
    int radacina, auxiliar;

    auxiliar = nod;

    while(auxiliar != parinte[auxiliar])
    {
        auxiliar = parinte[auxiliar];
    }

    radacina = auxiliar;

    auxiliar = nod;

    while(auxiliar != radacina)
    {
        auxiliar = parinte[nod];
        parinte[nod] = radacina;
        nod = auxiliar;
    }

    return radacina;
}


void uneste_arbori(int nod_x, int nod_y)
{
    int radacina_x = gaseste_radacina(nod_x);
    int radacina_y = gaseste_radacina(nod_y);

    if(radacina_x == radacina_y)
    {
        return;
    }

    if(marime_arbore[radacina_x] > marime_arbore[radacina_y])
    {
        parinte[radacina_y] = radacina_x;
        marime_arbore[radacina_x] += marime_arbore[radacina_y];
        marime_arbore[radacina_y] = 0;
    }
    else
    {
        parinte[radacina_y] = radacina_x;
        marime_arbore[radacina_y] += marime_arbore[radacina_x];
        marime_arbore[radacina_x] = 0;
    }

    return;
}


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

    int N, M;

    fin >> N >> M;

    initializare_padure(N);


    for(int i = 1; i <= M; ++i)
    {
        int cerinta, x, y;

        fin >> cerinta >> x >> y;

        if(cerinta == 1)
        {
            uneste_arbori(x, y);
        }
        else
        {
            if(gaseste_radacina(x) == gaseste_radacina(y))
            {
                cout << "DA\n";
            }
            else
            {
                cout << "NU\n";
            }
        }
    }

}