Cod sursa(job #2537930)

Utilizator MichaelXcXCiuciulete Mihai MichaelXcX Data 4 februarie 2020 09:48:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100005;

int N, M;
int parent[NMAX], Rank[NMAX];

int findSet(int);
void makeSet(int);
void unionSet(int, int);

int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL), cout.tie(NULL);

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

    cin >> N >> M;
    for(int i = 1; i <= N; ++i) {
        makeSet(i);
    }

    for(int i = 0; i < M; ++i) {
        int v, a, b;
        cin >> v;
        if(v == 1) {
            cin >> a >> b;
            unionSet(a, b);
        }
        if(v == 2) {
            cin >> a >> b;
            if(findSet(a) == findSet(b))
                cout << "DA\n";
            else
                cout << "NU\n";
        }
    }

}

int findSet(int v)
{
    if(parent[v] == v)
        return v;
    return parent[v] = findSet(parent[v]);
}
void makeSet(int v)
{
    parent[v] = v;
    Rank[v] = 1;
}

void unionSet(int a, int b)
{
    a = findSet(a);
    b = findSet(b);

    if(a != b) {
        if(Rank[a] < Rank[b])
            swap(a, b);

        parent[b] = a;
        if(Rank[a] == Rank[b])
            Rank[a]++;
    }
}