Cod sursa(job #2944313)

Utilizator Cosmin3105Cosmin Colceru Cosmin3105 Data 22 noiembrie 2022 12:34:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m;
int tata[100001], rang[100001];

int radacina(int x) {
	while (tata[x] != x)	// parcurg arborele in sus pana ajung la radacina
		x = tata[x];
	return x;
}

void reuniune(int x, int y) {
	int radacinaX = radacina(x);
	int radacinaY = radacina(y);
	if(rang[radacinaX] < rang[radacinaY])	// unesc arborele cu rangul mai mic de cel cu rangul mai mare
		tata[radacinaX] = radacinaY;
	else if(rang[radacinaY] < rang [radacinaX]) {
		tata[radacinaY] = radacinaX;
	}
	else {
		tata[radacinaY] = radacinaX;
		rang[radacinaX]++;
	}

}
int main() {
	fin >> n >> m;
	for (int i = 1; i <= n; i++) {
		tata[i] = i;
	}

	for(int i = 1; i  <= m; i++){
		int cod, x, y;
		fin >> cod >> x >> y;
		if(cod == 1) {
			reuniune(x, y);		
		}
		else
		{
			if (radacina(x) == radacina(y)) {
				fout << "DA" << '\n';
			} else
				fout << "NU" << '\n';
		}
	}

	return 0;
}