Cod sursa(job #1425720)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 27 aprilie 2015 22:05:42
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

#define MAX 100002
using namespace std;

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

int vader [ MAX ];
int rg [ MAX ];

void makeSet ( int n){
    vader [ n ] = n ;
    rg [ n ] = 0;
}

void Answer ( int x , int y){
    while ( x != vader [ x ] )
        x = vader [ x ];

    while ( y != vader [ y ] )
        y = vader [ y ];

    if ( y == x)
        g<<"DA \n";
    else
        g<<"NU \n";

}



int findParent ( int x){

    //path compresion
    if ( vader [ x ] != x )
        vader [ x ] = findParent( vader [ x ] ) ;
   // else
    return vader [ x ];
}

void Union ( int x , int y){

    x = findParent ( x );
    y = findParent ( y );

    if ( rg [ x ] > rg [ y ] )
        vader [ y ] = x ;
    else
        vader [ x ]  = y;

    if ( rg [ x ] == rg [ y ])
        rg [ y ] ++;

}

int main()
{
    int n , m , cd , y , x;

    f>>n>>m;
    while ( n ){
        makeSet ( n );
        n--;
    }

    while ( m ){
        m--;
        f>>cd>>x>>y;

        if (cd == 1)
            Union ( x , y );
        else
            Answer ( x , y);
    }

    return 0;
}