Cod sursa(job #2948371)

Utilizator GeorgeNistorNistor Gheorghe GeorgeNistor Data 27 noiembrie 2022 17:26:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
/*
    Kruskal's Algorithm
    https://www.infoarena.ro/problema/disjoint
    100p
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

int V, E; // numarul de noduri & muchii
vector<int> parrent; // vector de tati
vector<int> h;       // vector de inaltimi pentru subarbori

void Init(){
    h.resize(V+1, 0);
    parrent.resize(V+1, 0);
}

int Root(int u){
    while(parrent[u])
        u = parrent[u];
    return u;
}

void Union(int u, int v){
    int ru, rv; // radacina subarborelui u & radacina subarborelui v
    ru = Root(u);
    rv = Root(v);
    if(h[ru] > h[rv])
        parrent[rv] = ru;
    else {
        parrent[ru] = rv;
        if(h[ru] == h[rv])
            ++h[rv];
    }
}

int main() {
    fin >> V >> E;
    Init();
    for(int i = 0; i < E; i++){
        int op, u, v;
        fin >> op >> u >> v;
        if(op == 1){
            Union(u, v);
        }
        else if(Root(u) != Root(v))
            fout << "NU\n";
        else
            fout << "DA\n";
    }
    return 0;
}