Cod sursa(job #2908226)

Utilizator FraNNNkieFrancesco-Gregorio Petrovici FraNNNkie Data 2 iunie 2022 11:01:33
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>

using namespace std;
int sz[100001], parent[100001];
int n, numComponents, m;

int findGroup(int x){
    int root = x;
    while(parent[root] != root) {
        root = parent[root];
    }

    //path compression
    while(x != root) {
        int next = parent[x];
        parent[x] = root;
        x = next;
    }

    return root;
}

void unify(int x, int y){
    int grX = findGroup(x);
    int grY = findGroup(y);
    if(grX != grY) {
        if(sz[grX] >= sz[grY]) {
            parent[grY] = grX;
            sz[grX] += sz[grY];
        } else {
            parent[grX] = grY;
            sz[grY] += sz[grX];
        }
        numComponents--;
    }
}
int main()
{
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    f >> n >> m;
    numComponents = n;
    for(int i = 1; i <= n; ++i) {
        parent[i] = i;
        sz[i] = i;
    }

    for(int i = 1; i <= m; ++i) {
        int operation, x, y;
        f >> operation >> x >> y;
        if(operation == 1) {
            unify(x, y);
        } else if(operation == 2) {
            if(findGroup(x) == findGroup(y)) {
                g << "DA\n";
            } else {
                g << "NU\n";
            }
        }
    }
    return 0;
}