Cod sursa(job #3161570)

Utilizator xxUnrealUxxNiculae Adrian-Ioan xxUnrealUxx Data 27 octombrie 2023 15:14:39
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
using namespace std;

ifstream cin("disjoint.in");
ofstream cout("disjoint.out");

int m, n;
int p[100001], r[100001];

int Find(int x)
{
    int R, y;

    for(R = x; p[R] != R; R = p[R]);

    for(; p[x] != x;)
    {
        y = p[x];
        p[x] = R;
        x = y;
    }

    return R;
}

void Unite(int x, y)
{
    if(r[x] > r[y])
        p[y] = x;

    else
        p[x] = y;

    if(r[x] == r[y]) r[y]++;
}


int main()
{
    cin >> n >> m;

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

    for(int i = 1; i<=m; i++)
    {
        int r, x, y;
        cin >> r >> x >> y;
        int a = Find(x);
        int b = Find(y);

        if(r == 1)
        {
            if(a != b)
                Unite(a, b);
        }

        else
        {
            if(a == b) cout << "DA\n";
            else cout << "NU\n";
        }
    }
}