Cod sursa(job #2946735)

Utilizator miruna_georgescuMiruna Georgescu miruna_georgescu Data 25 noiembrie 2022 01:42:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
/*
	Paduri de multimi disjuncte https://www.infoarena.ro/problema/disjoint
		Se dau N multimi de numere, initial fiecare multime i continand un singur element, mai exact elementul i. Asupra acestor multimi se pot face 2 tipuri de operatii, 
	astfel:
		- operatia de tipul 1: se dau doua numere naturale x si y, intre 1 si N. Se cere sa reuneasca multimile in care se afla elementul x, respectiv elementul y (se 
	garanteaza ca x si y nu se vor afla in aceeasi multime)
		- operatia de tipul 2: se dau doua numere naturale x si y, intre 1 si N. Se cere sa afiseze DA daca cele 2 elemente se afla in aceeasi multime, respectiv NU 
	in caz contrar.

	Date de intrare
		Pe prima linie a fisierului de intrare disjoint.in se vor afla 2 numere, N si M, reprezentand numarul de multimi, respectiv numarul de operatii efectuate. Pe
	urmatoarele M linii se vor afla cate 3 numere, cod, x si y, cod reprezentand tipul operatiei, iar x si y avand semnificatia din enunt.

	Date de ieşire
		In fisierul de iesire disjoint.out se vor afisa mai multe linii, fiecare linie continand DA sau NU, reprezentand raspunsul la interogarea corespunzatoare din fisierul 
	de intrare.
*/

#include <fstream>
#include <vector> 

using namespace std; 

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

vector <int> tata;
vector <int> inaltime; 

int gasesteTata(int nod)
{
	while (tata[nod])
		nod = tata[nod]; 
	return nod; 
}

void reuneste(int arbore1, int arbore2)
{
	int tata1 = gasesteTata(arbore1); 
	int tata2 = gasesteTata(arbore2); 

	if (inaltime[tata1] < inaltime[tata2])
		tata[tata1] = tata2; 
	else
	{
		tata[tata2] = tata1; 
		if (inaltime[tata1] == inaltime[tata2])
			inaltime[tata1]++; 
	}
}

int main()
{
	int nrMultimi, nrOperatii; 
	fin >> nrMultimi >> nrOperatii;

	tata.resize(nrMultimi + 1, 0); //fiecare nod este radacina
	inaltime.resize(nrMultimi + 1, 1); //inaltimea fiecarui arbore este 1

	for (int i = 1; i <= nrOperatii; i++)
	{
		int operatie, multime1, multime2; 
		fin >> operatie >> multime1 >> multime2; 

		if (operatie == 1)
			reuneste(multime1, multime2); 
		else 
		{
			if (gasesteTata(multime1) == gasesteTata(multime2))
				fout << "DA";
			else
				fout << "NU"; 
			fout << "\n";
		}
	}
}