Cod sursa(job #277815)

Utilizator cotofanaCotofana Cristian cotofana Data 11 martie 2009 22:12:31
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <stdio.h>
#define dim 100000

int n, m, rg[dim], tt[dim];

int find(int x)
{
	int r, y;
	for (r=x; r!=tt[r]; r=tt[r]);
	while (x!=tt[x])
	{
		y=tt[x];
		tt[x]=r;
		x=y;
	}
	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 i, c, x, y;
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	
	for (i=1; i<=n; i++)
	{
		rg[i]=1;
		tt[i]=i;
	}

	for (; m; m--)
	{
		scanf("%d %d %d\n", &c, &x, &y);
		if (c==2)
		{
			if (find(x)==find(y)) printf("DA\n");
			else printf("NU\n");
		}
		else
			unite(x, y);
	}

	return 0;
}