Cod sursa(job #2558708)

Utilizator Antonio020712Potra Antonio Antonio020712 Data 26 februarie 2020 19:13:04
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#define NMAX 100005

using namespace std;

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

int n, m;
int marime[NMAX], tata[NMAX];

int gasesteRadacina(int x) {
    int r = x, y;

    // caut radacina
    while (tata[r] != r)
        r = tata[r];

    // compresia drumurilor
    while (tata[x] != x) {
        y = tata[x];
        tata[x] = r;
        x = y;
    }

    return r;
}

void uneste(int rx, int ry) {
    // unesc arborul mai mic la cel mai mare
    if (marime[rx] > marime[ry]) {
        tata[ry] = rx;
        marime[rx] += marime[ry];
    } else {
        tata[rx] = ry;
        marime[ry] += marime[rx];
    }
}

int main() {
    int i, o, x, y, rx, ry;

    fin >> n >> m;
    // initializez vectorii
    for (i = 1; i <= n; i++) {
        tata[i] = i;
        marime[i] = 1;
    }
    
    for (i = 1; i <= m; i++) {
        fin >> o >> x >> y;
        rx = gasesteRadacina(x);
        ry = gasesteRadacina(y);
        if (o == 2) {
            if (rx == ry)
                fout << "DA" << '\n';
            else
                fout << "NU" << '\n';
        } else {
            if (rx != ry)
                uneste(rx, ry);
        }
    }

    fin.close();
    fout.close();

    return 0;
}