Cod sursa(job #2942464)

Utilizator madalin1902Florea Madalin Alexandru madalin1902 Data 19 noiembrie 2022 18:10:26
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m;
vector <int> tata;
vector <int> inaltime;


int radacina(int nod) {
    if(tata[nod] == 0) // daca este radacina
        return nod;

    return tata[nod];
}


void compresie(int nod, int rad) {
    if(tata[nod] == 0) // daca este radacina
        return;

    compresie(tata[nod], rad);
    tata[nod] = rad;
}


void unire(int x, int y) {
    int tataX = radacina(x);
    int tataY = radacina(y);
    int inaltimeX = inaltime[tataX];
    int inaltimeY = inaltime[tataY];

    if (inaltimeX > inaltimeY) {
        tata[tataY] = tataX;
        compresie(y, tataX);
    }
    else if(inaltimeX < inaltimeY) {
        tata[tataX] = tataY;
        compresie(x, tataY);
    }
    else {
        tata[tataY] = tataX;
        compresie(y, tataX);
        inaltime[tataX]++;
    }
}


int main()
{
    fin >> n >> m;

    tata.resize(n + 1, 0);
    inaltime.resize(n + 1, 0);

    for (int i = 1; i <= m; i++) {
        int op, x, y;
        fin >> op >> x >> y;

        if (op == 1) {
            unire(x, y);
        }
        else if (op == 2) {
            if (radacina(x) == radacina(y))
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }

    fin.close();
    fout.close();
    return 0;
}