Cod sursa(job #2977029)

Utilizator gabriela.stanStan Luciana-Gabriela gabriela.stan Data 10 februarie 2023 17:48:28
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define NMAX 100001
using namespace std;

ifstream fin("disjoint.in");
ofstream fout("dijoint.out");

int n, m;
int h[100001], t[100001];

int radacina(int x)
{
    int rez = x;
    vector<int> drum;
    while (t[rez] != rez)
    {
        drum.push_back(rez);
        rez = t[rez];
    }

    for (int i : drum)
    {
        t[i] = rez;
    }

    return rez;
}

void reuniune(int i, int j)
{
    int r1 = radacina(i);
    int r2 = radacina(j);
    if (h[r1] > h[r2]) t[r2] = r1;
    else if (h[r1] < h[r2]) t[r1] = r2;
    else
    {
        t[r2] = r1;
        h[r1]++;
    }
}

int main()
{
    int x, y, c;
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        h[i] = 1;
        t[i] = i;
    }
    for (int i = 1; i <= m; i++)
    {
        fin >> c >> x >> y;
        if (c == 1) reuniune(x, y);
        else
        {
            int r1 = radacina(x);
            int r2 = radacina(y);
            if (r1 == r2) fout << "DA" << '\n';
            else fout << "NU" << '\n';
        }
    }
}