Cod sursa(job #2684750)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 14 decembrie 2020 18:41:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

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

int parent[100005];
int rank[100005];

void addSet(int node){
    parent[node] = node;
    rank[node] = 1;
}

int findRoot(int node){
    if(parent[node] == node) return node;
    parent[node] = findRoot(parent[node]);
    return parent[node];
}

void unionSets(int node1, int node2){
    node1 = findRoot(node1);
    node2 = findRoot(node2);

    if(node1 == node2) return;

    if(rank[node1] < rank[node2])
        std::swap(node1, node2);

    if(rank[node1] == rank[node2])
        rank[node1] ++;

    parent[node2] = node1;
}

int main(){
    int V, Q;
    fin >> V >> Q;

    for(int i=1; i<=V; i++)
        addSet(i);

    int type, node1, node2;
    for(int q=0; q<Q; q++){
        fin >> type >> node1 >> node2;
        if(type == 1){
            unionSets(node1, node2);
        }
        else{
            if(findRoot(node1) == findRoot(node2)) fout << "DA\n";
            else fout << "NU\n";
        }

    }

    return 0;
}