Cod sursa(job #3227342)

Utilizator code_blocksSpiridon Mihnea-Andrei code_blocks Data 29 aprilie 2024 19:49:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

class union_find
{
public:
    int set_find(int n)
    {
        vector<int> xs;

        while(n != _parent[n])
        {
            xs.push_back(n);
            n = _parent[n];
        }

        for(const auto& x : xs)
        {
            _parent[x] = n;
        }

        return n;
    }

    void set_union(int a, int b)
    {
        a = set_find(a);
        b = set_find(b);

        if(a != b)
        {
            if(_size[a] < _size[b])
            {
                _parent[a] = b;
                _size[b] += _size[a];
            }
            else
            {
                _parent[b] = a;
                _size[a] += _size[b];
            }
        }
    }

    union_find(int n)
    {
        for(int i = 0; i <= n; i++)
        {
            _parent.push_back(i);
            _size.push_back(1);
        }
    }

private:
    vector<int> _parent;
    vector<int> _size;
};

int main()
{
    int n, m;

    fin >> n >> m;

    union_find uf(n);

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

        if(t == 1)
        {
            uf.set_union(a, b);
        }
        else
        {
            fout << ((uf.set_find(a) == uf.set_find(b)) ? "DA" : "NU") << '\n';
        }
    }
}