Cod sursa(job #2803853)

Utilizator bianca_voicuBianca Voicu bianca_voicu Data 20 noiembrie 2021 15:44:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int Find(int x, vector<int> &dad) {
    int ans, aux;
    ans = x;

    while (ans != dad[ans])
        ans = dad[ans];

    while (x != dad[x]) {
        aux = dad[x];
        dad[x] = ans;
        x = aux;
    }

    return ans;
}


void Union(int x, int y, vector<int> &dad, vector<int> &rang) {
    int root_x = Find(x, dad);
    int root_y = Find(y, dad);

    if (rang[root_x] > rang[root_y]) {
        dad[root_y] = root_x;
        rang[root_x] += rang[root_y];
    } else {
        dad[root_x] = root_y;
        rang[root_y] += rang[root_x];
    }

}

int main() {
    int n, m, cod, x, y;
    f >> n >> m;

    vector<int> dad(n + 1);
    vector<int> rang(n + 1, 0);

    for (int i = 1; i <= n; ++i) {
        dad[i] = i;
    }


    for (int i = 0; i < m; ++i) {
        f >> cod >> x >> y;
        if (cod == 1) Union(x, y, dad, rang);
        else {
            if (Find(x, dad) == Find(y, dad))
                g << "DA\n";
            else g << "NU\n";
        }
    }


    f.close();
    g.close();
    return 0;
}