Cod sursa(job #2706234)

Utilizator Rares09Rares I Rares09 Data 14 februarie 2021 13:05:34
Problema Paduri de multimi disjuncte Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <map>

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

struct Node
{
    int dat;
    int rnk;
    Node *par;
    Node() {}
    Node(int dat, int rnk)
    {
        this->dat = dat;
        this->rnk = rnk;
        this->par = this;
    }
    Node(int dat, int rnk, Node *par)
    {
        this->dat = dat;
        this->rnk = rnk;
        this->par = par;
    }
};

map <int, Node*> mp;

void makeSet(int dat)
{
    Node *node = new Node(dat, 0);
    mp.insert({dat, node});
}

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(mp[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)
        swap(par1, par2);

    par2->par = par1;

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

void unionSet(int node1, int node2)
{
    unionSet(mp[node1], mp[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;
}