Cod sursa(job #658325)

Utilizator informatician28Andrei Dinu informatician28 Data 8 ianuarie 2012 16:11:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<fstream> 
#define NMAX 100001

using namespace std; 

ifstream in("disjoint.in"); 
ofstream out("disjoint.out"); 

int N,M,Tata[NMAX], Rang[NMAX];
int find(int nod) 
{
	int R; 
	//parcurg arborele in sus pana la radacina 
	
	for(R = nod; Tata[R] != R; R = Tata[R]); 
	
	//acum, comprim drumul 
	
	for(; Tata[nod] != nod ; ) 
	{
		
		Tata[nod] = R; 
		nod = R; 
	}
	
	return R; 
}
	
void unite(int x, int y) 
{
	if(Rang[x] > Rang[y]) 
		Tata[y] = x; 
	else 
		Tata[x] = y; 
	
		if(Rang[x] == Rang[y]) 
			Rang[y]++; 
}
int main() 
{
	int i,cod,x,y;
	in >> N >> M; 
	
	for(i = 1; i <= N; i++) 
		
			Tata[i] = i;
             
	

		for(i = 1; i <= M; i++) 
		{
			in >> cod >> x >> y; 
			
			if(cod == 2) 
				if(find(x) == find(y)) 
					out << "DA" << '\n'; 
				else out << "NU" << '\n';
			
			else unite(find(x),find(y)); 
		}
}