Cod sursa(job #2936012)

Utilizator tiberiusss26Titiriga Tiberiu Nicolae tiberiusss26 Data 7 noiembrie 2022 21:37:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

class multDisjuncta {
    int *rang, *tata, n;
public:
    multDisjuncta(int n) {
        this->n = n;
        rang = new int[n + 1];
        tata = new int[n + 1];
        creeazaMultimea();
    }

    void creeazaMultimea() {
        for (int i = 1; i <= n; i++)
            tata[i] = i;
    }

    int gaseste(int x) {
        if (tata[x] != x)
            tata[x] = gaseste(tata[x]);

        return tata[x];
    }

    void merge(int x, int y) {
        int xMult = gaseste(x);
        int yMult = gaseste(y);

        if (xMult == yMult)
            return;

        if (rang[xMult] < rang[yMult])
            tata[xMult] = yMult;

        else if (rang[xMult] > rang[yMult])
            tata[yMult] = xMult;
        else {
            tata[yMult] = xMult;
            rang[xMult]++;
        }
    }

    void executa(int m){
        for(int i =0;i<m;i++){
            int a,b,c;
            f>>a>>b>>c;
            if(a==1){
                merge(b,c);
            }
            if(a==2){
                if(gaseste(b)!= gaseste(c))
                    g<<"NU\n";
                else g<<"DA\n";
            }
        }
    }

    ~multDisjuncta() {}
};

int main() {
    int n,m;
    f>>n>>m;
    multDisjuncta a(n);
    a.executa(m);
}