Pagini recente » Cod sursa (job #2129373) | Cod sursa (job #2469807) | Cod sursa (job #1415284) | Cod sursa (job #2254149) | Cod sursa (job #3272224)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
// Deschidem fișierele de intrare și ieșire
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
class DisjointSet {
private:
vector<int> tata; // Vector pentru a reține părintele fiecărui nod
vector<int> inaltime; // Vector pentru a reține înălțimea fiecărui arbore
public:
// Constructor pentru inițializarea pădurii de mulțimi disjuncte
explicit DisjointSet(int nrNoduri) {
tata.resize(nrNoduri + 1);
inaltime.resize(nrNoduri + 1, 0);
// Fiecare nod este inițial propriul său părinte
for (int i = 1; i <= nrNoduri; i++) {
tata[i] = i;
}
}
// Găsirea reprezentantului mulțimii folosind compresia drumului
int reprezentant(int nod) {
if (tata[nod] != nod) {
tata[nod] = reprezentant(tata[nod]); // Compresia drumului
}
return tata[nod];
}
// Funcția pentru reunirea a două mulțimi
void reuneste(int nod1, int nod2) {
int radacina1 = reprezentant(nod1);
int radacina2 = reprezentant(nod2);
if (radacina1 != radacina2) {
// Unim arborii pe baza înălțimii lor
if (inaltime[radacina1] < inaltime[radacina2]) {
tata[radacina1] = radacina2;
} else if (inaltime[radacina1] > inaltime[radacina2]) {
tata[radacina2] = radacina1;
} else {
// Dacă au aceeași înălțime, facem pe unul dintre ei părinte și creștem înălțimea
tata[radacina2] = radacina1;
inaltime[radacina1]++;
}
}
}
// Verificare dacă două noduri aparțin aceleiași mulțimi
bool inAceeasiMultime(int nod1, int nod2) {
return reprezentant(nod1) == reprezentant(nod2);
}
};
int main() {
int nrNoduri, nrOperatii;
fin >> nrNoduri >> nrOperatii;
DisjointSet ds(nrNoduri); // Inițializăm structura disjunctă
for (int i = 0; i < nrOperatii; i++) {
int tipOperatie, nod1, nod2;
fin >> tipOperatie >> nod1 >> nod2;
if (tipOperatie == 1) {
// Operația de unire a două mulțimi
ds.reuneste(nod1, nod2);
} else if (tipOperatie == 2) {
// Operația de verificare dacă două noduri sunt în aceeași mulțime
if (ds.inAceeasiMultime(nod1, nod2)) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
}
fin.close();
fout.close();
return 0;
}