Cod sursa(job #2948929)

Utilizator David_PatranjelDavid Patranjel David_Patranjel Data 28 noiembrie 2022 19:15:17
Problema Paduri de multimi disjuncte Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
///Problema 2 - O(m log n)
///Link:
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
vector<int> parents;
vector<int> lungime;


///Gasirea radacinii unui subarbore
int find_parent(int node){
    if(!parents[node]){
        return node;
    }else{
        return parents[node] = find_parent(parents[node]);
    }
}

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

    int nodes, ops, op;
    fin>>nodes>>ops;
    parents.resize(nodes+1, 0);
    lungime.resize(nodes+1, 1);

    while(ops){
        ops--;
        fin>>op;
        int node1, node2;
        fin>>node1>>node2;
        ///Ne vom construi subarbori si vom salva pentru fiecare nod cate un tata, iar radacina va avea tatal 0
        int a = find_parent(node1);
        int b = find_parent(node2);
        switch(op){
            case 1:
                if(a != b){
                    ///Daca cele doua noduri au radacini diferinte, inseamna ca nu sunt in aceasi cc
                    ///Astfel, atribuim ca tata a radacinii primului nod radacina celuilalt nod
                    if(lungime[b] > lungime[a]){
                        parents[a] = b;
                        lungime[a] += lungime[b];
                    }else{
                        parents[b] = a;
                        lungime[b] += lungime[a];
                    }
                }
                break;
            case 2:
                ///La cazul 2, doar verificam daca cele doua noduri au aceasi radacina
                if(a == b){
                    fout<<"DA"<<endl;
                }else{
                    fout<<"NU"<<endl;
                }
                break;
            default:
                fout<<"Error";
        }
    }
    fin.close();
    fout.close();
    return 0;
}