Cod sursa(job #1607843)

Utilizator jurjstyleJurj Andrei jurjstyle Data 21 februarie 2016 17:20:26
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

using namespace std ;

ifstream f ("disjoint.in") ;
ofstream g ("disjoint.out") ;

int arbore[100002], rang[100002] ;
int n , m ;

int cauta ( int x )
{
    //merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi ( radacina )
    int R = x  ;
    while ( arbore[R] != R )
        R = arbore[R] ;
    //aplic compresia drumurilor ( unim nodurile la radacina , dar nu schimbam rangul )
    while ( arbore[x] != x )
        {
        int y = arbore[x] ;
        arbore[x] = R ;
        x = y ;
        }
    return R ; //returnam radacina
}

void uneste ( int x , int y )
{
    //unesc multimea cu rang mai mic de cea cu rang mai mare
    if ( rang[x] > rang[y] )
        arbore[y] = x ;
    else
        arbore[x] = y ;
    //in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
    if ( rang[x] == rang[y] )
        ++rang[y] ;
}

int main()
{

    f >> n >> m ;
    int i, x, y, cd;

    //initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
    for ( int i = 1 ; i <= n ; ++i )
         arbore[i] = i , rang[i] = 1 ;

    for ( int i = 1 ; i <= m ; ++i )
        {
        int x , y  , cod ;
        f >> cod >> x >> y ;

        if ( cod == 2 )
            {
            //verific daca radacina arborilor in care se afla x respectiv y este egala
            if ( cauta ( x )  == cauta ( y ) )
                g << "DA\n" ;
            else
                g << "NU\n" ;
            }
            else //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
                uneste ( cauta ( x ) , cauta ( y ) ) ;
        }
    return 0 ;
}