Cod sursa(job #1164381)

Utilizator SRaduRadu Szasz SRadu Data 2 aprilie 2014 00:36:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>

using namespace std;

const int MAX = 100010;

int N, M;
int Dad[MAX], Cnt[MAX];

int Find(int X) {
    int R = X;
    while(R != Dad[R]) 
        R = Dad[R];
    while(X != R) {
        int newX = Dad[X];
        Dad[X] = R;
        X = newX;        
    } return R;
}

void Merge(int X, int Y) {
    if(Cnt[X] > Cnt[Y]) {
        Dad[Y] = X;
    } else 
        Dad[X] = Y;
}

int main() {
    ifstream in("disjoint.in"); ofstream out("disjoint.out");
    in >> N >> M;
    
    for(int i = 1; i <= N; i++) {
        Dad[i] = i;
        Cnt[i] = i;
    }

    for(int i = 1, op, X, Y; i <= M; i++) {
        in >> op >> X >> Y;
        if(op == 1) {
            Merge(Find(X), Find(Y));
        } else {
            if(Find(X) != Find(Y)) 
                out << "NU\n";
            else out << "DA\n";
        }
    } in.close(); out.close();
}