Cod sursa(job #2306971)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 23 decembrie 2018 14:34:33
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

using namespace std ;

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

const int NR = 100001 ;

int father [ NR ] ;
int grad  [ NR ] ;

int root ( int x )
{
    int Root ;
    for( Root = x ; father [ x ] != x ; x = father [ x ] , Root = x  ) ;

    for ( ; father [ x ] != Root ; )
    {
        int y = father [ x ] ;
        father [ x ] = Root ;
        x = y ;
    }
    return Root ;
}

int unite ( int x , int y )
{
    if ( grad [ x ] < grad [ y ] )
        father [ x ] = y ;
    else
        father [ y ] = x ;
    if ( grad [ x ] == grad [ y ] )
        grad [ x ] ++ ;
}

int main ()
{
    int n , m , i ; f >> n >> m ;

    for ( i = 1 ; i <= n ; ++ i )
        grad [ i ] = 1 , father [ i ] = i ;
    while ( m -- )
    {
        int type , x1 ,x2 ;
        f >> type >> x1 >> x2 ;
        if ( type == 1 )  unite ( root ( x1 ) , root ( x2 ) ) ;

        if ( type == 2 )
        {
        if ( root ( x1 ) == root ( x2 ) )   g << "DA\n" ;
        else                                g << "NU\n" ;
        }
    }

}