Cod sursa(job #664870)

Utilizator tomaAndrei Toma toma Data 21 ianuarie 2012 00:32:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.58 kb
#include<stdio.h>
int RG[100002],T[100002],N,M,i,t,y,x;
int find(int x)
{
	int R=x,y;
	while (R!=T[R]) R=T[R];
	while (x!=R){
		y=T[x];
		T[x]=R;
		x=y;}
	return R;
}
void unite(int x,int y)
{
	if (RG[x]>RG[y]) T[y]=x;
		else T[x]=y;
	if (RG[x]==RG[y]) RG[y]++;
}
int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d",&N,&M);
	for (i=1;i<=N;i++) T[i]=i,RG[i]=1;
	for (i=1;i<=M;i++)
	{
		scanf("%d%d%d",&t,&x,&y);
		if (t==1) unite(find(x),find(y));
		else if (find(x)==find(y)) printf("DA\n");
		else printf("NU\n");
	}
}