Cod sursa(job #1838705)

Utilizator BLz0rDospra Cristian BLz0r Data 1 ianuarie 2017 16:54:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
using namespace std;

#define NMAX 100002

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

int Tata[NMAX], Grad[NMAX];

int GetRoot(int x) {

    int root;

    // gasim radacina
    for (root = x; root != Tata[root]; root = Tata[root]);

    // aplicam compresia drumurilor
    int aux;
    while (x != Tata[x]) {
        aux = Tata[x];
        Tata[x] = root;
        x = aux;
    }

    return root;
}

// unim doi arbori (multimi)
void Unite (int x, int y) {

    x = GetRoot(x);
    y = GetRoot(y);

    if (Grad[x] > Grad[y])
        Tata[y] = x;
    else
        Tata[x] = y;

    if (Grad[x] == Grad[y])
        Grad[y]++;
}

int main() {

    int N, M;

    fin >> N >> M;

    //actualizez vectorul de tati si ponderile multimilor
    for (int i = 1; i <= N; ++i) {
        Tata[i] = i;
        Grad[i] = 1;
    }

    // rezolvare
    int x, a, b;
    while (M--) {
        fin >> x >> a >> b;

        if (x == 1)
            Unite(a, b);
        else
            fout << (GetRoot(a) == GetRoot(b) ? "DA" : "NU") << "\n";
    }

    return 0;
}