Cod sursa(job #2793931)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 4 noiembrie 2021 09:35:33
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

#define NMAX 100005

struct nod {
    int tata, inaltime;
} noduri[NMAX];

int n, m;

void citire() {
    f >> n >> m;
    for (int i = 1; i <= n; ++i)
        noduri[i] = {i, 1};
}

int parinte(int x) {
    while (noduri[x].tata != x)
        x = noduri[x].tata;
    return x;
}

void reuniune(int x, int y) {
    if (noduri[x].inaltime <= noduri[y].inaltime) {
        noduri[x].tata = y;
        noduri[y].inaltime = max(noduri[y].inaltime, noduri[x].inaltime + 1);
    } else
        noduri[y].tata = x;
}

void actualizare(int x, int parinte_x) {
    int aux;
    while (noduri[x].tata != x) {
        aux = noduri[x].tata;
        noduri[x].tata = parinte_x;
        x = aux;
    }
}

void rezolvare() {
    int cod, x, y;
    for (int i = 1; i <= m; ++i) {
        f >> cod >> x >> y;
        if (cod == 1)
            reuniune(parinte(x), parinte(y));
        else {
            int parinte_x = parinte(x), parinte_y = parinte(y);
            actualizare(x, parinte_x);
            actualizare(y, parinte_y);
            g << ((parinte_x == parinte_y) ? "DA" : "NU") << '\n';
        }
    }
}

int main() {
    citire();
    rezolvare();
    return 0;
}