Pagini recente » Cod sursa (job #316865) | Cod sursa (job #1198042) | Cod sursa (job #809353) | Cod sursa (job #288140) | Cod sursa (job #2946735)
/*
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";
}
}
}