Cod sursa(job #266352)

Utilizator ScrazyRobert Szasz Scrazy Data 25 februarie 2009 12:51:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <cstdio>

#define maxn 100001

int n, m;

int parent[maxn], rank[maxn];

int find(int v)
{
	if (parent[v] == v) return v;
	return (parent[v] = find(parent[v]));
}

void merge(int a, int b)
{
	a = find(a); b = find(b);
	if (rank[a] > rank[b])
	{
		parent[b] = a;
	}
	else
	{
		parent[a] = b;
		if (rank[a] == rank[b]) ++rank[b];
	}
}

int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	
	scanf("%d%d", &n, &m);

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

	for (int i = 0; i < m; ++i)
	{
		int tip, x, y;
		scanf("%d%d%d", &tip, &x, &y);
		switch(tip)
		{
			case 1: merge(x,y); break;
			case 2: 
				{
					if (find(x) == find(y))
						printf("DA\n");
					else
						printf("NU\n");
				}
		}
	}
}