Cod sursa(job #2706252)

Utilizator Rares09Rares I Rares09 Data 14 februarie 2021 13:41:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");

struct Node
{
    int dat;
    int rnk;
    Node *par;
} v[100005];

void makeSet(int dat)
{
    v[dat].dat=dat;
    v[dat].rnk=0;
    v[dat].par=&v[dat];
}

Node* findPar(Node *node)
{
    if(node->par == node)
        return node;

    Node *par = findPar(node->par);
    node->par = par;
    return par;
}

int findPar(int dat)
{
    return findPar(&v[dat])->par->dat;
}

void unionSet(Node *node1, Node *node2)
{
    Node *par1 = findPar(node1);
    Node *par2 = findPar(node2);

    if(par1 == par2)
        return;

    if(par1->rnk >= par2->rnk)
    {
        par2->par = par1;

        if(par1->rnk == par2->rnk)
            ++par1->rnk;
    }
    else
        par1->par = par2;
}

void unionSet(int node1, int node2)
{
    unionSet(&v[node1], &v[node2]);
}

int main()
{
    int n, m;
    cin >> n >> m;

    for(int i = 1; i <= n; ++i)
        makeSet(i);

    for(int i = 1; i <= m; ++i)
    {
        int a, b, c;
        cin >> a >> b >> c;

        if(a == 1)
            unionSet(b, c);
        else
        {
            if(findPar(b) == findPar(c))
                cout << "DA\n";
            else
                cout << "NU\n";
        }
    }

    return 0;
}