Cod sursa(job #2298332)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 8 decembrie 2018 00:14:10
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

#define MAXN 100005

int N, M;
int Root[MAXN],
    Rang[MAXN];

int Find(int X) {
    int r = X;
    while (Root[r] != r)
        r = Root[r];

    int Aux;
    while (Root[X] != X)
        Aux = Root[X],
        Root[X] = r,
        X = Aux;
}

void Union(int X, int Y) {
    if (Rang[X] == Rang[Y]) {
        Root[Y] = X;
        ++ Rang[X];
    }   else
    if (Rang[Y] < Rang[X]) {
        Root[Y] = X;
    }
    else {
        Root[X] = Y;
    }
}

std::ifstream In("disjoint.in");
std::ofstream Out("disjoint.out");

void Citire() {
    In >> N >> M;
}

void Rezolvare() {
    for (int i=1; i<=N; ++i)
        Root[i] = i;

    int Type, X, Y;
    while (M--) {
        In >> Type >> X >> Y;
        if (Type == 1) Union(Find(X), Find(Y));
        else if (Type == 2) Out << (Find(X) == Find(Y) ? "DA" : "NU") << '\n' ;
    }
}

int main()
{
    Citire();
    Rezolvare();

    return 0;
}