Cod sursa(job #526163)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 27 ianuarie 2011 16:25:51
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<cstdio>
using namespace std;

int n,m,act,a,b,i,T[100005],R[100005],cauta(int x);

void read(),solve(),uneste(int x, int y);

int main()
{
	read();
	solve();
	return 0;
}

void read()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		T[i]=i;
		R[i]=1;
	}
}

void solve()
{
	for(;m;m--)
	{
		scanf("%d%d%d",&act,&a,&b);
		if(act==1) uneste(a,b);
		else {cauta(a)==cauta(b)?printf("DA\n"):printf("NU\n");}
	}
}

void uneste(int x,int y)
{
	x=cauta(x);
	y=cauta(y);
	if(R[x]>R[y]){T[y]=a;R[x]+=R[y];}
	else {T[x]=y;R[y]+=R[x];}
}

int cauta(int x)
{
	int aux,t;
	for(t=x;t!=T[t];t=T[t]);
	for(;x!=T[x];)
	{
		aux=T[x];T[x]=t;x=aux;
	}
	return t;
}