Cod sursa(job #1196798)

Utilizator tudi98Cozma Tudor tudi98 Data 9 iunie 2014 01:34:46
Problema Paduri de multimi disjuncte Scor 100
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){
	if(x!=P[x]) P[x]=FIND_SET(P[x]);
	return P[x];
}

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

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