Cod sursa(job #543735)

Utilizator avram_florinavram florin constantin avram_florin Data 28 februarie 2011 15:49:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<fstream>
#include<cstdio>
#define MaxN 100001

using namespace std;

int n,m,T[MaxN],rg[MaxN];

int find(int x)
{
	int rad,y;
	rad = x;
	while( T[rad] != rad )
		rad = T[rad];
	while( x != T[x] )
		{
			y = T[x];
			T[x] = rad;
			x = y;
		}
	return rad;
}

void unire(int x , int y)
{
	if( rg[x] <= rg[y] )
		T[x] = y;
		else
		T[y] = x;
	if( rg[x] == rg[y] )
		++rg[y];
}

int main(void)
{
	freopen("disjoint.in", "r" , stdin);
	freopen("disjoint.out" , "w" , stdout);
	scanf("%d%d" , &n , &m );
	int i,tip,x,y;
	for( i = 1 ; i <= n ; i++ )
		T[i] = i,rg[i] = 1;
	for( i = 1 ; i <= m ; i++ )
		{
			scanf("%d%d%d" , &tip , &x , &y );
			if( tip == 1 )
				unire(find(x),find(y));
				else
				if( find(x) == find(y) )
					printf("DA\n");
					else
					printf("NU\n");
		}
	return 0;
}