Cod sursa(job #229427)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 10 decembrie 2008 09:29:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include <cstdio>
using namespace std;
#define MAX 100100

int T[MAX], R[MAX];
int N, M;

int r(int a) {
	if ( T[a]==a ) return a;
	return r(T[a]);
}

void u(int a, int b) {
	int ra = r(a), rb = r(b);
	if ( R[ra] == R[rb] ) {
		R[ra] ++;
		T[rb] = ra;
	} else {
		if ( R[ra] < R[rb] )
			T[ra] = rb;
		else
			T[rb] = ra;
	}
}

int main() {
	freopen( "disjoint.in", "r", stdin );
	freopen( "disjoint.out", "w", stdout );
	
	scanf( "%d %d", &N, &M );
	for ( int i=1; i<=N; ++i ) T[i] = i, R[i] = 0;
	
	while ( M-- ) {
		int c,x,y;
		scanf( "%d %d %d", &c, &x, &y);
		switch ( c ) {
			case 1:
				u(x,y);
			break;
			case 2:
				printf( "%s\n", (r(x)==r(y)) ? "DA" : "NU" );
			break;
		}
	}
	return 0;
}