Cod sursa(job #3155266)

Utilizator not_anduAndu Scheusan not_andu Data 7 octombrie 2023 19:19:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

class DSU{

private:
    // parintele unui numar si vector de dimensiune pentru fiecare multime
    vector<int> parent, sz;

public:

    DSU(int n){
        
        parent.resize(n + 1);
        sz.resize(n + 1, 1);

        // initializarea multimilor
        for(int i = 1; i <= n; ++i){
            parent[i] = i;
        }

    }

    int findParent(int value){
        
        // cand parintele unei multimi este elementul insusi
        if(parent[value] == value){
            return value;
        }

        return parent[value] = findParent(parent[value]);

    }

    void unite(int x, int y){

        x = findParent(x), y = findParent(y);

        if(sz[x] < sz[y]){
            swap(x, y);
        }

        if(x == y){
            return;
        }

        parent[y] = x;
        sz[x] += sz[y];

    }

};

int main(){

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

    int n, m;

    fin >> n >> m;

    DSU dsu(n);

    for(int i = 0; i < m; ++i){
        
        int tip, x, y;

        fin >> tip >> x >> y;

        if(tip == 1){

            dsu.unite(x, y);

        }
        else{

            if(dsu.findParent(x) == dsu.findParent(y)){
                fout << "DA" << '\n';
            }
            else{
                fout << "NU" << '\n';
            }

        }

    }

    return 0;

}