Cod sursa(job #2490953)

Utilizator gazdac_alex@yahoo.comGazdac Alexandru Eugen [email protected] Data 11 noiembrie 2019 15:26:21
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int n, m;
int const maxim = 100000;

int parinte[maxim] = { 0 };
int rang[maxim] = { 0 };
int dimensiune[maxim] = { 0 };

int cauta(int x) {
	if (parinte[x] != x) {
		parinte[x] = cauta(parinte[x]);
	}
	return parinte[x];
}

void unire(int x, int y) {
	int radacina_x = cauta(x);
	int radacina_y = cauta(y);
	
	if (radacina_x == radacina_y) return;

	if (rang[radacina_x] < rang[radacina_y]) {
		swap(radacina_x, radacina_y);
	}

	parinte[radacina_y] = radacina_x;
	if (rang[radacina_x] == rang[radacina_y]) {
		rang[radacina_x]++;
	}
 }

void verificare(int x, int y) {
	int radacina_x = cauta(x);
	int radacina_y = cauta(y);

	if (radacina_x == radacina_y)out << "DA" << endl;
	else out << "NU" << endl;
}


int main() {
	in >> n >> m;
	for (int i = 1; i <= n; i++)parinte[i] = i;
	int a, b, operatie;
	for (int i = 1; i <= m; i++) {
		in >> operatie >> a >> b;
		if (operatie == 1)unire(a, b);
		else verificare(a, b);
	}

	return 0;
}