Cod sursa(job #1821048)

Utilizator enacheionutEnache Ionut enacheionut Data 2 decembrie 2016 15:16:17
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MAX_LENGTH 100001

using namespace std;

vector<int> arbore;
vector<int> rang;

int numarMultimi;
int numarInterogari;

void Init()
{
    for( int index = 0; index < numarMultimi; ++index )
    {
        arbore.push_back(index);
        rang.push_back(1);
    }
}

int Cautare(int nod)
{
    int radacina;
    int nodAux;

    for( radacina = nod; arbore[radacina] != radacina; radacina = arbore[radacina] );
    for( ; arbore[nod] != nod ; nodAux = arbore[nod], arbore[nod] = radacina, nod = nodAux );

    return radacina;
}

void UnesteMultimile(int nod1, int nod2)
{
    rang[nod1] > rang[nod2] ? arbore[nod2] = nod1 : arbore[nod1] = nod2;
    if( rang[nod1] == rang[nod2] )
        ++rang[nod2];
}

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

    inputStream>> numarMultimi>> numarInterogari;
    Init();

    for( int interogare = 1; interogare <= numarInterogari; ++interogare )
    {
        int tipInterogare;
        int nod1;
        int nod2;
        inputStream>> tipInterogare>> nod1>> nod2;

        if( tipInterogare == 2 )
            outputStream<< ( Cautare(nod1 - 1) == Cautare(nod2 - 1)  ? "DA\n" : "NU\n" );
        else
            UnesteMultimile(Cautare(nod1 - 1), Cautare(nod2 - 1));
    }
    return 0;
}