Cod sursa(job #1374604)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 5 martie 2015 10:14:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");

const int kNMax = 100010;
int n, tata[kNMax], inaltime[kNMax];

void Initializare() {
    for (int i = 1; i <= n; ++i) {
        tata[i] = i;
        inaltime[i] = 1;
    }
}

void Unire(int nod1, int nod2) {
    if (inaltime[nod1] == inaltime[nod2]) {
        inaltime[nod1]++;
        tata[nod2] = nod1;
    }
    if (inaltime[nod1] > inaltime[nod2])
        tata[nod2] = nod1;
    if (inaltime[nod1] < inaltime[nod2])
        tata[nod1] = nod2;
}

int Dfs(int nod) {
    if (tata[nod] != nod)
        tata[nod] = Dfs(tata[nod]);
    return tata[nod];
}

int main () {
    int m, operatie, x, y;
    in >> n >> m;
    Initializare();
    while (m--) {
        in >> operatie >> x >> y;
        if (operatie == 1)
            Unire(Dfs(x), Dfs(y));
        if (operatie == 2)
            if(Dfs(x) == Dfs(y))
                out << "DA" << '\n';
            else
                out << "NU" << '\n';
    }
    in.close();
    out.close();
    return 0;
}