Cod sursa(job #2870543)

Utilizator mihaicrisanMihai Crisan mihaicrisan Data 12 martie 2022 13:48:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int n, m, c, a, b;
int RG[NMAX], T[NMAX];

void init() {
    ///initializare vector tati si vectori rang
    for (int i = 1; i <= n; i++) {
        T[i] = i;
        RG[i] = 1;
    }
}

int radacina(int node) {
    if (T[node] == node)
        return node;
    return radacina(T[node]);
}

void unite(int x, int y) {
    ///regam multimile in funtie de rang
    if (RG[x] < RG[y])
        T[x] = T[y];
    else
        T[y] = T[x];

    ///in caz de egalitate se alege una din mulimi la care se leaga celalta
    ///si ii creste rangul
    if (RG[x] == RG[y])
        T[y] = T[x], RG[x]++;
}

int main(){
    fin >> n >> m;
    init();
    for (int i = 1; i <= m; i++) {
        fin >> c >> a >> b;
        a = radacina(a);
        b = radacina(b);

        if (c == 1)
            unite(a, b);
        else {
            if (a == b)             ///daca au aceeasi radacina inseamna ca se afla in aceeasi multime
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }
    return 0;
}