Cod sursa(job #1279381)

Utilizator PikachuPikachu Pikachu Data 30 noiembrie 2014 11:01:51
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.66 kb
#include <cstdio>

using namespace std;

const int NMAX = 100005;

int t[NMAX], h[NMAX];

int findx(int x)
{
	while(x != t[x])
		x = t[x];
	return x;
}

void uniset(int x, int y)
{
	if(h[x] == h[y])
	{
		t[y] = x;
		++h[x];
	}else
	if(h[x] > h[y]){
		t[y] = x;
	}
	else
		t[x] = y;
}

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

	int n, m, op, x, y;
	scanf("%d%d", &n, &m);

	for(int i = 1; i <= n; ++ i)
		t[i] = i;

	for(int i = 1; i <= m; ++ i)
	{
		scanf("%d%d%d", &op, &x, &y);
		if(op == 1)
			uniset(findx(x),findx(y));
		else
		{
			if(findx(x) == findx(y))	printf("DA\n");
			else
				printf("NU\n");
		}
	}

	return 0;
}