Cod sursa(job #3148592)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 2 septembrie 2023 19:49:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

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

const int maxDim = 1e5 + 5;

int n , m , parent[maxDim] , height[maxDim];

class DSU
{
public:

    void Initialise ()
    {
        for(int i = 1 ; i <= n ; ++i)
        {
            parent[i] = i;
            height[i] = 1;
        }
    }
    void Union (int a , int b)
    {
        int rootA = Find(a) , rootB = Find(b);
        if(rootA != rootB)
        {
            if(height[rootA] < height[rootB])
                parent[rootA] = rootB;
            else if(height[rootB] < height[rootB])
                parent[rootB] = rootA;
            else
            {
                parent[rootA] = rootB;
                height[rootB]++;
            }
        }
    }
    int Find (int a)
    {
        int rootA = a;
        while(parent[rootA] != rootA)
            rootA = parent[rootA];
        while(parent[a] != rootA)
        {
            int auxiliary = parent[a];
            parent[a] = rootA;
            a = auxiliary;
        }
        return rootA;
    }
};

DSU sets;

int main()
{
    fin >> n >> m;
    sets.Initialise();
    for(int i = 1 ; i <= m ; ++i)
    {
        int operation , a , b;
        fin >> operation >> a >> b;
        if(operation == 1)
            sets.Union(a , b);
        else
        {
            bool result = (sets.Find(a) == sets.Find(b));
            if(result)
                fout << "DA\n";
            else
                fout << "NU\n";
        }

    }
}