Cod sursa(job #418341)

Utilizator ooctavTuchila Octavian ooctav Data 15 martie 2010 19:31:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
#define IN "disjoint.in"
#define OUT "disjoint.out"
#define NMAX 100100
int N, M;
int TT[NMAX], RG[NMAX];

int find(int x)
{
	int r, aux;
	for(r = x ; TT[r] != r ; r = TT[r]);
	
	while(TT[x] != x)
	{
		x = TT[x];
		TT[x] = r;
	}
	
	return r;
}

void unite(int x ,int y)
{
	if(RG[x] > RG[y])
		TT[y] = x;
	else
		TT[x] = y;
	
	if(RG[x] == RG[y])
		RG[y]++;
}

int main()
{
	int ide, x, y;
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d%d",&N,&M);
	for(int i = 1 ; i <= N ; i++)
	{
		RG[i] = 1;
		TT[i] = i;
	}
	for(int i = 1 ; i <= M ; i++)
	{
		scanf("%d%d%d",&ide,&x,&y);
		if(ide == 1)
			unite(find(x), find(y));
		else
		{
			if(find(x) == find(y))
				printf("DA\n");
			else
				printf("NU\n");
		}
	}
	
	return 0;
}