Cod sursa(job #2942863)

Utilizator raskyNichita Sincarenco rasky Data 20 noiembrie 2022 11:08:46
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream fcin("disjoint.in");
ofstream fcout("disjoint.out");

int n, m;
vector<int> tati;

int caut_radacina(int src)
{
    if(src!=tati[src])
        return caut_radacina(tati[src]);
    return src;
}

void reuninunea(int x, int y)
{
    int tata_x = caut_radacina(x);
    int tata_y = caut_radacina(y);
    tati[tata_x] = tata_y;
}

int main()
{
    fcin>>n>>m;
    tati.push_back(0);
    for(int i = 1; i<=n; ++i)
        tati.push_back(i);
    int x, y, cod;
    for(int i=1; i<=m; ++i)
    {
        fcin>>cod>>x>>y;
        switch (cod)
        {
        case 1:
            // facem reuniunea a radacinei elementului x cu radacina elementului y
            reuninunea(x, y);
            break;
        
        case 2:
            // parcurgem arborele in sus si daca ajungem la aceeasi radacina
            // atunci elementele noastre sunt in aceeasi multime
            if(caut_radacina(x) == caut_radacina(y))
                fcout<<"DA\n";
            else fcout << "NU\n";
            break;
        }
    }   
    fcin.close();
    fcout.close();
    return 0;
}