Cod sursa(job #2906589)

Utilizator StefanZotaZota Stefan StefanZota Data 26 mai 2022 18:57:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

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

const int maxN = 100005;
int n, m, parent[maxN], depth[maxN];

int absolute_parent(int x)  // functia care intoarce valoarea parintelui absolut (radacinii)
{
    if(parent[x] == x)
        return x;
    return parent[x] = absolute_parent(parent[x]);  // o apelam recursiv pana la radacina
}

void unite(int x, int y)  // functia care uneste cele 2 multimi
{
    if(depth[x] < depth[y])
        parent[x] = y;
    else if(depth[x] > depth[y])
        parent[y] = x;
    else
        parent[y] = x, depth[x]++;
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        parent[i] = i;  // fiecare nod este initial parintele propriu
    for(int code, x, y, i = 1; i <= m; i++)
    {
        fin >> code >> x >> y;  // citim pe rand din fisier codul operatiei si cele doua numere
        if(code == 1)
        {
            x = absolute_parent(x), y = absolute_parent(y);
            unite(x, y); // daca codul este 1, unim cele 2 multimi
        }
        if(code == 2)
        {
            x = absolute_parent(x), y = absolute_parent(y);
            if(x == y)  // daca au acelasi parinte absolut (aceeasi radacina) inseamna ca sunt in aceeasi multime
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }
    return 0;
}