Cod sursa(job #2624343)

Utilizator EckchartZgarcea Robert-Andrei Eckchart Data 4 iunie 2020 18:45:42
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> parent, tree_size;
int nr_vertices, nr_edges;


inline void make_set(const int &vertex)
{
    parent[vertex] = vertex;
    tree_size[vertex] = 1;
}


int find_root(int &vertex)
{
    if (parent[vertex] == vertex)
    {
        return vertex;
    }
    return parent[vertex] = find_root(parent[vertex]);
}


void unite_sets(int &node1, int &node2)
{
    node1 = find_root(node1);
    node2 = find_root(node2);

    if (node1 != node2)
    {
        if (tree_size[node1] < tree_size[node2])
        {
            swap(node1, node2);
        }

        parent[node2] = node1;
        tree_size[node1] += tree_size[node2];
    }
}


bool is_in_same_connected_component(int &node1, int &node2)
{
    return find_root(node1) == find_root(node2);
}


int main()
{
    ifstream fin("disjoint.in");

    fin >> nr_vertices >> nr_edges;
    parent.resize(nr_vertices + 1);
    tree_size.resize(nr_vertices + 1);

    for (int node = 1; node <= nr_vertices; ++node)
    {
        make_set(node);
    }

    ofstream fout("disjoint.out");
    while (nr_edges--)
    {
        short command;
        int i, j;
        fin >> command >> i >> j;

        switch (command)
        {
        case 1:
            unite_sets(i, j);
            
            break;

        default:
            fout << (is_in_same_connected_component(i, j) ? "DA\n" : "NU\n");
        }
    }
}