Cod sursa(job #3003385)

Utilizator vladxandrewVlad Andrei vladxandrew Data 15 martie 2023 18:17:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
// Paduri de multimi disjuncte - 100p
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
#define MAX 100001
vector<int> parent(MAX + 1);
vector<int> rang(MAX + 1);
void make_set(int v) 
{
    rang[v] = 0;
    parent[v] = v;
}
int find_set(int v) 
{
    if (parent[v] == v) 
        return v;
    return parent[v] = find_set(parent[v]);
}
void union_set(int a, int b) 
{
    a = find_set(a);
    b = find_set(b);
    if (rang[a] < rang[b])
        swap(a, b);
    parent[b] = a;
    if (rang[a] == rang[b])
        rang[a]++;
}
int main()
{
    int n, m;
    f >> n >> m;
    int t, a, b;
    for (int i = 1; i <= n; i++)
        make_set(i);
    for (int q = 1; q <= m; q++) 
    {
        f >> t >> a >> b;
        if (t == 1) // Reuniunea multimii care il contine pe a cu cea care il contine pe b
            union_set(a, b);
        else 
            if (find_set(a) == find_set(b)) //  Se afla a si b in aceeasi multime?
                g << "DA" << '\n';
            else
                g << "NU" << '\n';
    }
    f.close();
    g.close();
    return 0;
}