Cod sursa(job #2839812)

Utilizator teofilotopeniTeofil teofilotopeni Data 26 ianuarie 2022 16:56:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <vector>
using namespace std;

vector<int> parent, rang;

void unite(int x, int y) {
    if (rang[x] > rang[y]) {
        parent[y] = x;
    }
    else {
        parent[x] = y;
    }

    if (rang[x] == rang[y]) {
        ++rang[y];
    }
}

int find(int x) {
    int root = x;
    while (parent[root]) {
        root = parent[root];
    }

    while (parent[x]) {
        int aux = x;
        x = parent[x];
        parent[aux] = root;
    }
    return root;
}

int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    int n, m;
    scanf("%d %d ", &n, &m);
    parent = rang = vector<int>(n + 1, 0);

    for (; m; --m) {
        int cod, x, y;
        scanf("%d %d %d", &cod, &x, &y);

        if (cod == 1) {
            unite(find(x), find(y));
        }
        else if (find(x) == find(y)) {
            printf("DA\n");
        }
        else {
            printf("NU\n");
        }
    }
    return 0;
}