Cod sursa(job #315619)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 16 mai 2009 15:50:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>
#define NM 100001
int n;
int set[NM+1],h[NM+1];

void Makeset(int x){
set[x]=x;
h[x]=0;
}

/*
int Find(int x){
if(set[x]==x) return x;
else return Find(set[x]);
} */
int Find(int x){
int r=x;
while(set[r]!=r) r=set[r];
int i=x,j;
while(i!=r){
	j=set[i];set[i]=r;i=j;
	}
return r;
}

void Union(int x,int y){
int xroot=Find(x),yroot=Find(y);
if(h[xroot]>h[yroot]) set[yroot]=xroot;
else if(h[yroot]>h[xroot]) set[xroot]=yroot;
	 else {
		set[yroot]=xroot;
		h[xroot]++;
		}
}

int main(){
freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
int i,m,t,x,y,xr,yr;
scanf("%d%d",&n,&m);
i=1;
while(i<=n) Makeset(i++);
while(m--){
	scanf("%d%d%d",&t,&x,&y);
	switch(t){
		case 1:Union(x,y);
			   break;
		case 2:xr=Find(x);
			   yr=Find(y);
			   if(xr==yr) printf("DA\n");
			   else printf("NU\n");
			   break;
		}
	}
return 0;
}