Cod sursa(job #3193356)

Utilizator ioanabaduIoana Badu ioanabadu Data 14 ianuarie 2024 14:56:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#define N_MAX 100005

using namespace std;

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

int v[N_MAX], nextElem[N_MAX], sizeSet[N_MAX];
int n, m;

void unite(int x, int y);
int find(int x);

void initializare (){
    for (int i=1; i<=n; ++i){
        v[i] = i;
        nextElem[i] = i;
        sizeSet[i] = 1;
    }
}

void unite (int x, int y){
    int setX, setY, i;

    if (sizeSet[x] < sizeSet[y])
        swap(x, y);

    setX = find(x);
    setY = find (y);
    if (setX != setY){ // fac parte din multimi diferite
        sizeSet[x] += sizeSet[y];
        i = y;
        do{
            v[i] = setX;
            i = nextElem[i]; // se duce tot la urmatorul element si il baga in multimea x
        } while (i != y);

        swap (nextElem[x], nextElem[y]); // what is this? what does this do? 
    }
}

int find (int x){
    return v[x];
}

int main (){
    in >> n >> m;
    initializare();

    int op, x, y;
    for (int i=1; i<=m; ++i){
        in >> op >> x >> y;
        if (op == 1){
            unite (x, y);
        }
        else{
            if (find(x) == find(y))
                out << "DA" << '\n';
            else
                out << "NU" << '\n';
        }
    }
    return 0;
}