Cod sursa(job #2944998)

Utilizator ScoveargaIlie Andrei-Virgil Scovearga Data 23 noiembrie 2022 11:42:21
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>

using namespace std;

const int N = 100001;
int radacina[N], rang[N], radacina_X, radacina_Y, n, m,operatie, x, y;

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

int cautaRadacina(int n) //aflam radacina
{
    if(radacina[n] == 0)
        return n;
    radacina[n] = cautaRadacina(radacina[n]);
    return radacina[n];
}

bool operatie2(int x, int y)
{
    return(cautaRadacina(x) == cautaRadacina(y));
}

void operatie1(int x, int y)
{
    radacina_X = cautaRadacina(x);
    radacina_Y = cautaRadacina(y);
    if(rang[x] < rang[y])
    {
        radacina[radacina_X] = radacina_Y; //unim arborele mai mic cu cel mai mare
        rang[radacina_Y] += rang[radacina_X];
    }
    else
    {
        radacina[radacina_Y] = radacina_X;
        rang[radacina_X] += rang[radacina_Y];
    }
}

int main()
{
    f>>n>>m;
    for(int i = 1; i <= n; ++i)
    {
        radacina[i] = i;
        rang[i] = 1;
    }
    for(int i = 1; i <= m; ++i)
    {
        f>>operatie>>x>>y;
        switch (operatie)
        {
            case 1:
            {
                operatie1(x, y);
                break;
            }
            case 2:
            {
                if(operatie2(x, y))
                {
                    g<<"DA\n";
                }
                else
                {
                    g<<"NU\n";
                }
            }
        }
    }
    return 0;
}