Cod sursa(job #352443)

Utilizator adelinasAdelina Spataru adelinas Data 1 octombrie 2009 20:05:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.63 kb
#include <stdio.h>
#define N 100005
int A[N],R[N],n,m;
void unit(int x,int y){
	if(R[x]>R[y])
		A[y]=x;
	else A[x]=y;
	if(R[x]==R[y]) R[y]++;
}
int gasit(int x){
	int y,z;
	for(y=x;A[y]!=y;y=A[y]);
	while(x!=A[x]){
		z=A[x];
		A[x]=y;
		x=z;
	}
	return y;
}
int main(){
	int i,x,y,z;
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){
		R[i]=1;
		A[i]=i;
	}
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&z,&x,&y);
		if(z==1)
			unit(gasit(x),gasit(y));
		else
			if(gasit(x)==gasit(y)) 
				printf("DA\n");
		else printf("NU\n");
	}
	return 0;
}