Cod sursa(job #2937785)

Utilizator liviu_gheorghe1234Liviu Gheorghe liviu_gheorghe1234 Data 10 noiembrie 2022 23:45:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int N, M;
int* tt;
int* h;


int Find(int node) {
    
    if(tt[node] == 0) {
        return node;
    }

    return tt[node] = Find(tt[node]);

}


void Union(int x, int y) {
    // Atunci cand reunim 2 multimi (cea in care se afla X si cea in care se afla Y), ceea ce avem de facut este sa legam arborele mai mare la arborele mai mic (arborii din care fac parte elementul X resp elementul Y)

    // Inaltimile arborilor le putem obtine din vectorul h, pe care il actualizam corespunzator dupa fiecare operatie de Union

    int tataX = Find(x);
    int tataY = Find(y);

    // Comparam inaltimea arborilor cu radacinile tataX resp tataY

    if(h[tataX] > h[tataY]) {
        // In acest caz, atasam la arborele din care face parte X (arborele mai mare) arborele din care face parte Y (arborele mai mic)

        tt[tataY] = tataX;
    } else if(h[tataX] < h[tataY]) {
        // Invers 

        tt[tataX] = tataY;
    } else {
        // Nu conteaza pe care dintre arbori il legam la celalalt, insa trebuie sa updatam inaltimea arborelui rezultat si sa o incrementam cu 1
        tt[tataY] = tataX;
        h[tataX]++;
    }
}

bool SameSet(int x, int y) {
    return Find(x) == Find(y);
}

int main() {

    fin >> N; 
    fin >> M;

    tt = new int[N+1];
    h = new int[N+1];

    for(int i = 0; i<= N; i++) {
        tt[i] = 0;
        h[i] = 1;
    }

    int cod, x, y;

    for(int i = 1; i <= M; i++) {
        fin >> cod >> x >> y;

        if(cod == 1) {
            Union(x, y);
        }

        else if(cod == 2) {
            fout << (SameSet(x,y) ? "DA\n" : "NU\n");
        }
    }

    return 0;
}