Cod sursa(job #2945882)

Utilizator DannyBroUngureanu Dan-Andrei DannyBro Data 24 noiembrie 2022 11:41:35
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
/// complexitate: M*logN

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>

using namespace std;

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

vector <int> radacini; ///vector de tati

int Find(int x) ///obtinem radacina arborelui din care face parte nodul x
{
    if(x == radacini[x]) return x;
    else Find(radacini[x]);
}

/*int find_height(int x)
{
    if(x == radacini[x]) return 0;
    else return 1 + find_height(radacini[x]);
}
*/

void Union(int x, int y) ///unim doi arbori (construim astfel incat arborii mai inalti sa fie intotdeauna cei cu radacina mai mica)
{
    int xroot = Find(x);
    int yroot = Find(y);

    if(xroot > yroot)
    {
        radacini[yroot] = xroot;
    }

    else radacini[xroot] = yroot;
}

int main() {
    int N, M;
    fin >> N >> M;

    radacini.resize(N+1);

    for(int i=1; i<=N; i++) ///setam radacina arborelui fiecarui nod cu el insusi
        radacini[i] = i;

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

        if(op == 2)
        {
            if(Find(x) == Find(y))
                fout << "DA\n";
            else fout << "NU\n";
        }

        else if(op == 1)
        {
            Union(x, y);
        }
    }

    return 0;
}