Cod sursa(job #3215607)

Utilizator titus_ticusanTitus Ticusan titus_ticusan Data 15 martie 2024 10:49:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <vector>

using namespace std;

struct DisjointSet
{
    vector<int> parent;
    vector<int> rank;

    DisjointSet(int n)
    {
        parent.resize(n + 1);
        rank.resize(n + 1, 1);

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

    int find(int u)
    {
        if (parent[u] != u)
            parent[u] = find(parent[u]);
        return parent[u];
    }

    void unite(int u, int v)
    {
        int rootU = find(u);
        int rootV = find(v);

        if (rootU == rootV)
            return;

        if (rank[rootU] > rank[rootV])
            parent[rootV] = rootU;
        else if (rank[rootU] < rank[rootV])
            parent[rootU] = rootV;
        else
        {
            parent[rootV] = rootU;
            rank[rootU]++;
        }
    }
};

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    int N, M;
    cin >> N >> M;

    DisjointSet ds(N);

    for (int i = 0; i < M; ++i)
    {
        int code, x, y;
        cin >> code >> x >> y;

        if (code == 1)
        {
            ds.unite(x, y);
        }
        else
        {
            if (ds.find(x) == ds.find(y))
                cout << "DA\n";
            else
                cout << "NU\n";
        }
    }

    return 0;
}