Cod sursa(job #1613542)

Utilizator roxannemafteiuMafteiu-Scai Roxana roxannemafteiu Data 25 februarie 2016 14:29:15
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>

#define NMAX 100020

using namespace std;

int N, M, c, x, y;
int TT[NMAX], RG[NMAX];

int gasesteRadacina(int nod)
{
    int radacina;

    //merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
    for(radacina = nod; TT[radacina] != radacina; radacina = TT[radacina]);

    //aplic compresia drumurilor pana gasesc un nod care pointeaza catre NOD-ul nostru
    for( ; TT[nod] != nod; )
    {
        y = TT[nod];
        TT[nod] = radacina;
        nod = y;
    }

    return radacina;
}

void uneste(int nod1, int nod2)
{
    //unesc multimea cu rang mai mic de cea cu rang mai mare
    if (RG[nod1] > RG[nod2])
        TT[nod2] = nod1;
    else TT[nod1] = nod2;

    //in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
    if (RG[nod1] == RG[nod2]) RG[nod2]++;
}

int main()
{
    ifstream in("disjoint.in");
    ofstream out("disjoint.out");

    in >> N >> M;

    for(int i = 1; i <= N; ++i)
    {
        TT[1] = 1; //fiecare nod pointeaza catre el insusi
        RG[1] = 1; // rangul fiecarui arbore este 1
    }

    for(int i = 1; i <= M; ++i)
    {
        in >> c >> x >> y;
        if(c == 2)
        {
            // verific daca radacina arborului in care se afla x si y este egala
            if(gasesteRadacina(x) == gasesteRadacina(y))
                out << "DA" << "\n";
            else
                out << "NU" << "\n";
        }
        else // unesc radacinile arborolui
        {
            if(gasesteRadacina(x) == gasesteRadacina(y))
                 uneste(gasesteRadacina(x), gasesteRadacina(y));

        }
    }

    in.close();
    out.close();

    return 0;
}