Pagini recente » Cod sursa (job #728925) | Cod sursa (job #89614) | Cod sursa (job #896242) | Cod sursa (job #2150243) | Cod sursa (job #1122966)
#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;
}