Cod sursa(job #443375)

Utilizator nandoLicker Nandor nando Data 16 aprilie 2010 20:38:12
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
using namespace std;

FILE* fin=fopen("disjoint.in","r");
FILE* fout=fopen("disjoint.out","w");

#define MAXN 100000

int nod[MAXN],rang[MAXN],n,m;

void update(int x,int y){
	if(rang[x]>rang[y]){
		nod[y]=x;		
	}else{
		nod[x]=y;	
	}
	
	if(rang[x]==rang[y]){
		rang[y]++;	
	}
}

int find(int x){
	int r,y;
	for(r=x;nod[r]!=r;r=nod[r]);
	
	while(nod[x]!=x){
		y=nod[x];
		nod[x]=r;
		x=y;
	}
}

bool query(int x,int y){
	return find(x)==find(y);
}

int main(){
	fscanf(fin,"%d %d\n",&n,&m);

	for(int i=0;i<n;i++){
		nod[i]=i,rang[i]=1;
	}

	int tip,x,y;
	for(int i=0;i<m;i++){
		fscanf(fin,"%d %d %d\n",&tip,&x,&y);
		switch(tip){
			case 1:
				update(x,y);
				break;
			case 2:
				if(query(x,y)){
					fprintf(fout,"DA\n");
				}else{
					fprintf(fout,"NU\n");
				}
				break;
		}
	}

	fclose(fin);
	fclose(fout);
	return 0;
}