Cod sursa(job #726647)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 27 martie 2012 13:10:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<stdio.h>
#define nmax 100005
int n,m,t[nmax],h[nmax];
int find(int x){
	int r,y;
	r=x;
	while(t[r]!=0)//gasim radacina arborelui
		r=t[r];
	while(t[x]!=0){//realizam compresia
		y=t[x];
		t[x]=r;
		x=y;
	}
	return r;
}
void unite(int x,int y){
	if(h[x]>h[y])
		t[y]=x;
	else
		t[x]=y;
	if(h[x]==h[y])//h[x]==h[y] => t[x]=y
		h[y]++;
}
int main(){
	FILE *f,*g;
	int a,b,c,i;
	f=fopen("disjoint.in","r");
	g=fopen("disjoint.out","w");
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++){
		t[i]=0;
		h[i]=1;
	}
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&c,&a,&b);
		if(c==2)
			if(find(a)==find(b))
				fprintf(g,"DA\n");
			else
				fprintf(g,"NU\n");
		else
			unite(find(a),find(b));
	}
	fclose(f);
	fclose(g);
	return 0;
}