Cod sursa(job #1461388)

Utilizator EpictetStamatin Cristian Epictet Data 15 iulie 2015 16:43:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

using namespace std;

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

int N, M , op_tip;
int *RG, *TT;

int Find(int x)
{
    int y, bos = TT[x];
    while (bos != TT[bos])
        bos = TT[bos];
    while (TT[x] != x)
    {
        y = TT[x];
        TT[x] = bos;
        x = y;
    }
    return bos;
}

void Unite(int x, int y)
{
    if (RG[x] < RG[y]) TT[x] = y, RG[y] += RG[x];
    else TT[y] = x, RG[x] += RG[y];
    if (RG[x] == RG[y]) RG[x] += 1;
}

int main()
{
    fin >> N >> M;
    RG = new int[N + 1]();
    TT = new int[N + 1]();

    for (int i = 1; i <= N; i++)
    {
        RG[i] = 1;
        TT[i] = i;
    }

    for (int x, y, i = 1; i <= M; i++)
    {
        fin >> op_tip >> x >> y;
        switch (op_tip)
        {
            case 1 :
            {
                Unite(Find(x), Find(y));
                break;
            }
            case 2 :
            {
                if (Find(x) == Find(y)) fout << "DA\n";
                else fout << "NU\n";
            }
        }
    }

    return 0;
}