Cod sursa(job #3189932)

Utilizator Manolea_Teodor_StefanManolea Teodor Stefan Manolea_Teodor_Stefan Data 6 ianuarie 2024 17:55:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

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

int n, q;
vector<int> T;
int cerinta, nodeX, nodeY;

int getRoot(int node) {
    while (T[node] > 0) {
        node = T[node];
    }
    return node;
}

void join(int nodeA, int nodeB) {
    int rootA = getRoot(nodeA);
    int rootB = getRoot(nodeB);
    if (rootA == rootB) {
        return;
    }
    if (T[rootA] <= T[rootB]) {
        T[rootA] += T[rootB];
        T[rootB] = rootA;
    } else {
        T[rootB] += T[rootA];
        T[rootA] = rootB;
    }
}

bool query(int nodeA, int nodeB) {
    return getRoot(nodeA) == getRoot(nodeB);
}

int main() {
    fin >> n >> q;
    T.assign(n + 1, -1);
    while (q--) {
        fin >> cerinta >> nodeX >> nodeY;
        if (cerinta == 1) {
            join(nodeX, nodeY);
        } else {
            bool sameForest = query(nodeX, nodeY);
            if (sameForest) {
                fout << "DA\n";
            } else {
                fout << "NU\n";
            }
        }
    }
    return 0;
}