Cod sursa(job #2935352)

Utilizator andlftLefter Andrei andlft Data 6 noiembrie 2022 16:32:15
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>


using namespace std;

vector <int> tati;
vector <int> inaltimi;

int findRoot (const int &a)
{
    if(tati[a] == a)
    {
        return a;
    }
    else
    {
        return findRoot(tati[a]);
    }
}

void unify(const int &a, const int &b)
{
    if(inaltimi[a]>inaltimi[b])
    {
        tati[findRoot(b)] = findRoot(a);
    }
    else if(inaltimi[b]>inaltimi[a])
    {
        tati[findRoot(a)] = findRoot(b);
    }
    else
    {
        int aux = findRoot(a);
        tati[aux] = findRoot(b);
        inaltimi[aux] ++;
    }

}

bool verify(const int &a, const int &b)
{
    return findRoot(a) == findRoot(b);
}


int main()
{

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

    int n, m, op, a, b;
    fin >> n >> m;
    tati.resize(n+1);
    inaltimi.resize(n+1, 0);

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

    for(int i = 0; i < m; i++)
    {
        fin >> op >> a >> b;

        if(op == 1)
        {
            unify(a,b);
        }
        else
        {
            if (verify(a,b))
            {
                fout<<"DA\n";
            }
            else
            {
                fout<<"NU\n";
            }
        }
    }



    return 0;
}