Cod sursa(job #291451)

Utilizator cotofanaCotofana Cristian cotofana Data 29 martie 2009 21:05:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include <stdio.h>
#define dim 100100

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

int find(int x)
{
	int r, y;
	for (r=x; r!=tt[r]; r=tt[r]);
	while (x!=r)
	{
		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 op, x, y, i;
	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", &op, &x, &y);
		if (op==1)
			if (find(x)!=find(y)) unite(find(x), find(y));
			else return -1;
		else
			if (find(x)==find(y)) printf("DA\n");
			else printf("NU\n");
	}
	return 0;
}