Cod sursa(job #370734)

Utilizator titusuTitus C titusu Data 1 decembrie 2009 22:16:10
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
/*
 	paduri de multimi disjunte.
	Se dau n elemente, initial fiecare in propria multime. si m operatii
	1 x y - multimile din care fac parte x si y se reunesc
	2 x y - se verifica daca x si  y fac parte din aceesai multime.

Implementarea cu structuri arborescente:
	x,y fac parte din acceasi multime daca sunt in aclasi arbore, adica radacina arborelui lui x este identica cu radacina arborelui lui y
	
	In aceasta varianta aplica o euristica numita reuniunea dupa rang:
		memoram pentru fiecare arbore inaltimea sa in vectorul rang[i] (valorile lui sunt corecte doar daca i este radacina arborelui) - aici consideram adancimea numarul de etaje. Daca avem de unit doi arbori, il unim pe cel mic de cel  mare

 */

using namespace std;
#include <fstream>
#define MAX 100010
int tata[MAX], n, rang[MAX];

void uneste(int , int);
int verifica(int , int);
int radacina(int v);


int main(){
	ifstream fin("disjoint.in");
	ofstream fout("disjoint.out");
	int m,op,x,y;
	fin>>n>>m;
	for(; m ; --m){
		fin>>op>>x>>y;
		if(op==1)
			uneste(x,y);
		else
			if(verifica(x,y))
				fout<<"DA\n";
			else
				fout<<"NU\n";
	}
	return 0;
}

void uneste(int x , int y){
	int rx = radacina(x);
	int ry = radacina(y);
	if(rang[rx]<rang[ry])
		tata[rx] = ry;
	else
		if(rang[rx]>rang[ry])
			tata[ry] = rx;
		else
			tata[ry] = rx, rang[ry]++;
}

int verifica(int x, int y){
	return radacina(x) == radacina(y);
}

int radacina(int x){
	while(tata[x])
		x = tata[x];
	return x;
}