Cod sursa(job #2986205)

Utilizator Teodor11Posea Teodor Teodor11 Data 27 februarie 2023 21:51:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.85 kb
#include <iostream>
#include <fstream>
using namespace std;

const int NMAX = 100005;
int n, m, x, y, code, parent[NMAX], nodeRank[NMAX];

/// 1. Reuniuena dupa rang:
///     > Declar global un vector rank[]
///     > Determin radacinile celor doua noduri, parametri ai subprogramului de reuniune
///     > Radacina al carei rang este mai mare va deveni radacina ambilor arbori
///     * In cazul in care ambele radacini au acelasi rang, atunci va fi aleasa aleatoriu una
///       din cele doua radacina drept radacina a ambilor arbori, iar rangul acesteia va fi incrementat

/// 2. Comprimarea drumului:
///    > Pentru fiecare nod parcurs, vom retine intr-o variabila radacina arborelui
///      din care fac parte aceste noduri, iar la finalizarea parcurgerii arborelui,
///      prin gasirea radacinii acestuia, vom stabili drept parinte al tuturor nodurilor
///      parcurse nodul radacina salvat in variabila


/// we need to find the root of a tree

int findRoot(int node) {
    if (!parent[node]) {
        return node;
    }
    parent[node] = findRoot(parent[node]);
    return parent[node];
}

/* Old function

int findRoot(int node) {
    if (!parent[node]) {
        return node;
    }
    return findRoot(parent[node]);
}
*/

/// we need to unite two trees

void uniteTrees(int node1, int node2) {
    int node1Root = findRoot(node1), node2Root = findRoot(node2);
    if (nodeRank[node1Root] > nodeRank[node2Root]) {
        parent[node2Root] = node1Root;
    } else {
        parent[node1Root] = node2Root;
        if (nodeRank[node1Root] == nodeRank[node2Root]) {
            ++nodeRank[node2Root];
        }
    }
}

/* Old function

void uniteTrees(int node1, int node2) {
    int node1Root = findRoot(node1), node2Root = findRoot(node2);

    cout << "x: " << node1 << endl;
    cout << "y: " << node2 << endl;
    cout << "Root of x: " << node1Root << endl;
    cout << "Root of y: " << node2Root << endl;

    if (node1Root != node2Root) {
        parent[node1Root] = node2Root;
    }
}
*/

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

    for (int i = 0; i < m; ++i) {
        fin >> code >> x >> y;
        if (code == 1) {
            //parent[x] = y;
            uniteTrees(x, y);
        } else {
            if (findRoot(x) == findRoot(y)) {
                fout << "DA\n";
            } else {
                fout << "NU\n";
            }
        }
        /*
        for (int j = 1; j <= n; ++j) {
            cout << parent[j] << ' ';
        }
        cout << endl << endl;
        */
    }
    /*
    for (int i = 1; i <= m; ++i) {
        fin >> x >> y;
        parent[x] = y;
    }
    */
    for (int i = 1; i <= n; ++i) {
        cout << "Root of node " << i << ": " << findRoot(i) << endl;
    }
    return 0;
}