Cod sursa(job #2325930)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 23 ianuarie 2019 11:01:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>

using namespace std;

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

const int NMax = 100000;

int TT[NMax + 5], H[NMax + 5], N, M, p, x, y;

int Root(int Nod)
{
    while(TT[Nod]) Nod = TT[Nod];

    return Nod;
}

void Unite(int N1, int N2)
{
    int R1 = Root(N1), R2 = Root(N2);

    if(H[R1] < H[R2])      ///Unesc de R2
    {
        TT[R1] = R2;
    }
    else if(H[R1] == H[R2])///Unesc de R2
    {
        TT[R1] = R2, H[R2]++;
    }
    else                   ///Unesc de R1
        TT[R2] = R1;
}

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= N; i++) H[i] = 1;

    while(M--)
    {
        fin >> p >> x >> y;

        if(p == 1)
            Unite(x, y);
        else
            fout << ((Root(x) == Root(y)) ? "DA" : "NU") << '\n';
    }

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

    return 0;
}