Cod sursa(job #3272224)

Utilizator AndreeaHzmAndreea Huzum AndreeaHzm Data 28 ianuarie 2025 22:37:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.65 kb
#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;
}