Cod sursa(job #2417400)

Utilizator claudiapopescuPopescu Claudia claudiapopescu Data 29 aprilie 2019 17:57:58
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

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

const int Inf = 1e9 + 5;
const int Dim = 1e5 + 5;

int p[Dim], w[Dim];
int n, m;

int Find (int node) {
    int cp = node;
    while (p[cp] != cp) {
        cp = p[cp];
    }

    while (node != cp) {
        int aux = p[node];
        p[node] = cp;
        node = aux;
    }

    return node;
}

void Union (int n1, int n2) {
    if (Find(n1) == Find(n2))
        return;

    if (w[n1] < w[n2]) {
        p[n2] = n1;
        w[n1] += w[n2];
    }

    else {
        p[n1] = n2;
        w[n2] += w[n1];
    }
}

int main() {
    f >> n >> m;
    for (int i = 1; i <= n; ++ i) {
        p[i] = i, w[i] = 1;
    }

    for (int i = 1; i <= m; ++ i) {
        int type, x, y; f >> type >> x >> y;
        if (type == 1) {
            Union (x, y);
        }

        else {
            if (Find(x) == Find (y)) g << "DA\n";
            else g << "NU\n";
        }
    }
    return 0;
}