Cod sursa(job #1196795)

Utilizator tudi98Cozma Tudor tudi98 Data 9 iunie 2014 01:16:26
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.67 kb
#include <fstream>
#define dim 100005

int P[dim],rank[dim],n,k,m,t,x,y,i;

void CREATE_SETS(int n){
	for(i=1;i<=n;i++){
		rank[i]=1;
		P[i]=i;		
	}
}

int FIND_SET(int x){
	
	int i=x,aux;
	for(;i!=P[i];i=P[i]);
	while(P[x]!=x){
		aux = P[x];
		P[x]=i;
		x=aux;
	}
	return i;
}

void MERGE_SETS(int x,int y){
	if(rank[x]>rank[y])
		P[y]=x;
	else P[x]=y;
	if(rank[x]==rank[y]) rank[y]++;
}

int main(){

	std::ifstream f("disjoint.in");
	std::ofstream g("disjoint.out");

	f >> n >> m;
	CREATE_SETS(n);

	for(k=1;k<=m;k++){
		f >> t >> x >> y;
		if(t==1){
			if(FIND_SET(x)!=FIND_SET(y)) MERGE_SETS(x,y);
		}
		else{
			if(FIND_SET(x)==FIND_SET(y)) g << "DA\n";
			else g << "NU\n";
		}
	}
}