Cod sursa(job #633899)

Utilizator sebii_cSebastian Claici sebii_c Data 15 noiembrie 2011 00:32:38
Problema Paduri de multimi disjuncte Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#define NMAX 10010

int father[NMAX], rank[NMAX];

int find(int x)
{
	int R, y;
	
	for (R = x; R != father[R]; R = father[R]);
	
	for ( ; x != father[x]; ) {
		y = father[x];
		father[x] = R;
		x = y;
	}
	return R;
}

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

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