Cod sursa(job #2501841)

Utilizator Crocodil_deapaCrocodil Deapa Crocodil_deapa Data 30 noiembrie 2019 11:39:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>

using namespace std;

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

int Parinti[100002];
int nr_elem[100002];

int n, m;
int x, y;
int nr, i;

int operatie;

void operatie_1(int x,  int y)
{
    int x1 = x;

    while(x1 != Parinti[x1])
    {
        x1 = Parinti[x1];
    }

    int x2 = x;

    while(x2 != Parinti[x2])
    {
        x2 = Parinti[x2];
        Parinti[x2] = x1;
    }

    int y1 = y;

     while(y1 != Parinti[y1])
    {
        y1 = Parinti[y1];
    }

    int y2 = y;

     while(y2 != Parinti[y2])
    {
        y2 = Parinti[y2];
        Parinti[y2] = y1;
    }

    if(nr_elem[x1] >= nr_elem[y1])
    {
        Parinti[y1] = x1;
        nr_elem[x1] += nr_elem[y1];
    }
    else
    {
        Parinti[x1] = y1;
        nr_elem[y1] += nr_elem[x1];
    }

}

void operatie_2(int x, int y)
{
     int x1 = x;

    while(x1 != Parinti[x1])
    {
        x1 = Parinti[x1];
    }

    int x2 = x;

    while(x2 != Parinti[x2])
    {
        x2 = Parinti[x2];
        Parinti[x2] = x1;
    }

    int y1 = y;

     while(y1 != Parinti[y1])
    {
        y1 = Parinti[y1];
    }

    int y2 = y;

     while(y2 != Parinti[y2])
    {
        y2 = Parinti[y2];
        Parinti[y2] = y1;
    }

    if(x1 == y1)
        fout<<"DA \n";
    else
        fout<<"NU \n";
}

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

    for(i = 1; i <= n; i++)
    {
        Parinti[i] = i;
        nr_elem[i] = 1;
    }

    for(i = 1; i <= m; i++)
    {
        fin>>operatie>>x>>y;
        if(operatie == 1)
            operatie_1(x, y);
        else
            operatie_2(x, y);
    }

    return 0;
}