Cod sursa(job #754274)

Utilizator adalLica Adela adal Data 1 iunie 2012 12:43:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>
#define MAX 100020

using namespace std;

int Tata[MAX], Rang[MAX], N, M, i, x, y, c;

int cauta(int x){
	int radacina, y;

    radacina = x;
	while (Tata[radacina] != radacina) radacina = Tata[radacina];

	while(Tata[x] != x)
	{
		y = Tata[x];
		Tata[x] = radacina;
		x = y;
	}
	return radacina;
}

void uneste(int x, int y){

	if (Rang[x] > Rang[y])
		Tata[y] = x;
			else Tata[x] = y;

	if (Rang[x] == Rang[y]) Rang[y]++;
}

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

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

	for (i = 1; i <= N; i++){
		Tata[i] = i; Rang[i] = 1;
	}

	for (i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &c, &x, &y);

		if (c==1) {
			if (cauta(x) == cauta(y))	printf("%d ", i);
			else uneste(cauta(x), cauta(y));
			}
		else {
			if (cauta(x) == cauta(y)) printf("DA\n");
			else printf("NU\n");
		}
	}
	return 0;
}