Cod sursa(job #1482078)

Utilizator bpalaniciPalanici Bogdan bpalanici Data 5 septembrie 2015 22:45:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

int n, m;
int multime[100005], rang[100005];

int find(int x)
{
    int root, swap_variable;
    for (root = x; multime[root] != root; root = multime[root]); ///gasim radacina multimii
    /*for (; x != multime[x]; x = multime[x]) ///
    {
        swap_variable = multime[x];
        multime[x] = x;
        x = swap_variable;
    }*/
    return root;
}

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

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++)
        multime[i] = i, rang[i] = 1; ///initial rangul 1, si fiecare multime are doar el. i

    for (int i = 1, op, x, y; i <= m; i++)
    {
        scanf("%d %d %d", &op, &x, &y);
        x = find(x); y = find(y);
        if (op == 2)
            printf(x == y ? "DA\n" : "NU\n");
        else
            unite(x, y);
    }
    return 0;
}