Cod sursa(job #2501860)

Utilizator Cosmin1708Mihart Cosmin Cosmin1708 Data 30 noiembrie 2019 11:44:03
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
using namespace std;

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

int n, m, cod;
int i;
int parinte[100002], marime[100002];

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

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

    int x2 = x;

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

    int y1 = y;

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

    int y2 = y;

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

    if(marime[x1] >= marime[y1])
    {
        parinte[y1] = x1;
        marime[x1] += marime[y1];
    }
    else
    {
        parinte[x1] = y1;
        marime[y1] += marime[x1];
    }
}

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

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

    int x2 = x;

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

    int y1 = y;

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

    int y2 = y;

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

    if(marime[x1] >= marime[y1])
    {
        parinte[y1] = x1;
        marime[x1] += marime[y1];
    }
    else
    {
        parinte[x1] = y1;
        marime[y1] += marime[x1];
    }

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

}

int main()
{
    int x, y;

    fin >> n >> m;

    for (i = 1; i <= n; i++)
    {
        parinte[i] = i;
        marime[i] = 1;
    }

    for (i = 1; i <= m; i++)
    {
        fin >> cod >> x >> y;

        if (cod == 1)
            operatie_1(x, y);
        else
            operatie_2(x, y);
    }
    return 0;
}