Cod sursa(job #1122966)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 25 februarie 2014 21:36:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#define MAXN 100001

int father[MAXN], rang[MAXN];

inline int TheUltimateFather( int x ) {
    while( x != father[x] )
        x = father[x];
    return x;
}

inline int father_and_raise( int x, int y ) {
    while( y != father[y] ) {
        rang[y] += rang[x];
        y = father[y];
    }
    rang[y] += rang[x];
    return y;
}

inline void father_and_unify( int x, int val, int adrang ) {
    int aux;
    while( x != father[x] ) {
        rang[x] = adrang;
        aux = father[x];
        father[x] = val;
        x = aux;
    }
    rang[x] = adrang;
    father[x] = val;
}

inline void unific( int x, int y ) {
    int k;
    if( rang[x] <= rang[y] ) {
        k = father_and_raise( x, y );
        father_and_unify( x, k , rang[y] );
    }
    else {
        k = father_and_raise( y, x );
        father_and_unify( y, k , rang[x] );
    }
}

int main () {
    FILE *f, *g;
    f = fopen( "disjoint.in", "r" );
    g = fopen( "disjoint.out", "w" );

    int n, m, x, y, tip;
    fscanf( f, "%d%d", &n, &m );

    for( int i = 1 ; i <= n ; ++i ) {
        father[i] = i;
        rang[i] = 1;
    }

    for( int i = 0 ; i < m ; ++i ) {
        fscanf( f, "%d%d%d", &tip, &x, &y );
        switch( tip ) {
            case 1:
                unific( x, y );
                break;
            case 2:
                if( TheUltimateFather( x ) == TheUltimateFather( y ) )
                    fprintf( g, "DA\n" );
                else
                    fprintf( g, "NU\n" );
                break;
        }
    }

    fclose( f );
    fclose( g );
    return 0;
}