Cod sursa(job #1757106)

Utilizator din99danyMatei Daniel din99dany Data 14 septembrie 2016 15:39:40
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
using namespace std;

#define NMAX 100005

int v[ NMAX ],
    a[ NMAX ];
int n;

int radacina( int x );
bool query( int x, int y );
void reuniune( int x, int y );

int main()
{

    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    int m, i, j, x, y, c, k;

    scanf("%d%d",&n,&m);
    for( i = 1; i <= n; ++i ) v[ i ] = i;
    while( m-- ){
        scanf("%d%d%d",&c,&x,&y);
        if( c == 1 ) reuniune( x, y );
        else
            if( query( x, y ) ) printf("DA\n");
            else printf("NU\n");
    }

    return 0;

}


int radacina( int x ){

    if( x == v[ x ] ) return x;
    return radacina( v[ x ] );

}

void reuniune( int x, int y ){

    int rx, ry;
    rx = radacina( x );
    ry = radacina( y );

    if( a[ rx ] > a[ ry ] ) v[ ry ] = rx, a[ rx ]++;
    else v[ rx ] = ry, a[ ry ]++;

}

bool query( int x, int y ){

    int rx, ry, aux;
    rx = radacina( x );
    ry = radacina( y );

    while( x != rx ){
        aux = x;
        x = v[ x ];
        v[ aux ] = rx;
    }

    return rx == ry;

}