Cod sursa(job #610186)

Utilizator elfusFlorin Chirica elfus Data 25 august 2011 15:05:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
#define NMAX 100100

int dad[NMAX], R[NMAX];

int search(int nod)
{
	int aux = nod, tata;
	while(nod != dad[nod])
		nod = dad[nod];
	tata = nod;
	nod = aux;
	while(nod != tata)
	{
		aux = dad[nod];
		dad[nod] = tata;
		nod = aux;
	}
	return tata;
}

void unite(int nod1, int nod2)
{
	if(R[nod1] >= R[nod2])
		{
		dad[nod2] = nod1;
		if(R[nod1] == R[nod2])
			R[nod1] ++;
		}
	else
		dad[nod1] = nod2;
}

int main()
{
	int N, M, tip, x, y, i, DadX, DadY;

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

	scanf("%d%d", &N, &M);

	for(i = 1; i <= N; i ++)
		dad[i] = i, R[i] = 1;

	while(M --)
	{
		scanf("%d%d%d", &tip, &x, &y);
		DadX = search(x);
		DadY = search(y);
		if(tip == 1)
			unite(DadX, DadY);
		if(tip == 2)
			printf("%s\n", DadX == DadY ? "DA" : "NU");
	}

	return 0;
}