Cod sursa(job #2806225)

Utilizator Pop_MariaPop Maria Pop_Maria Data 22 noiembrie 2021 14:22:57
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>

using namespace std;

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

class Graf
{
private:

    int parinte[100001], dimensiune[100001];

public:

    void disjoint();
    int gasire_multime(int);
    void operatie_tip_1(int, int);
};

int Graf :: gasire_multime(int a)
{
    while(a != parinte[a])
        a = parinte[a];

    return a;
}

void Graf :: operatie_tip_1(int a, int b)
{
    a = gasire_multime(a);
    b = gasire_multime(b);

    if(dimensiune[b] <= dimensiune[a])
    {
        dimensiune[a] += dimensiune[b];
        parinte[b] = a;
    }
    else
    {
        dimensiune[b] += dimensiune[a];
        parinte[a] = b;
    }
}

void Graf :: disjoint()
{
    int numar_multimi, numar_operatii, numar1, numar2, tip_operatie;

    fin >> numar_multimi >> numar_operatii;

    for(int i = 0; i < numar_multimi; i++)
    {
        dimensiune[i] = 1;
        parinte[i] = i;
    }

    for(int i = 0; i < numar_operatii; i++)
    {
        fin >> tip_operatie >> numar1 >> numar2;

        if(tip_operatie == 1)
            operatie_tip_1(numar1, numar2);

        else if(gasire_multime(numar1) != gasire_multime(numar2))
                    fout << "DA" << '\n';
        else fout << "NU" << '\n';
    }
}

int main()
{
    Graf x;
    x.disjoint();

    return 0;
}