Cod sursa(job #780872)

Utilizator stef1995mmarcu stefan ovidiu stef1995m Data 22 august 2012 16:08:42
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<iostream>
#include<fstream>
using namespace std;
const int maxx=100002;
int a,b,c,n,k,i,tt[maxx],rang[maxx];
int tata(int nod)
{
	int varf,x;
	for(varf=nod;tt[varf]!=varf;varf=tt[varf]);
	for(x=nod;tt[x]!=varf;x=tt[x],tt[nod]=varf,nod=x);
	return varf;
}
void unire(int a,int b)
{
	if(tata(a)!=tata(b))
	{
		if(rang[a]>rang[b])
		{
			tt[b]=a;
			rang[a]+=rang[b];
		}
		else
		{
			tt[a]=b;
			if(rang[a]==rang[b])
				rang[b]++;
			else
				rang[b]+=rang[a];
		}
	}
}
int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d %d\n",&n,&k);
	for(i=1;i<=n;i++)
	{
		tt[i]=i;
		rang[i]=1;
	}
	for(i=1;i<=k;i++)
	{
		scanf("%d %d %d\n",&a,&b,&c);
		if(a==1)
			unire(b,c);
		else
			if(tata(b)==tata(c))
				printf("DA\n");
			else
				printf("NU\n");
	}
	return 0;
}