Cod sursa(job #443377)

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

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

#define MAXN 100005

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

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;
	}
}

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

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

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

	for(int i=1;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;
}