Cod sursa(job #2501813)

Utilizator Cosmin1708Mihart Cosmin Cosmin1708 Data 30 noiembrie 2019 11:32:09
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 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 x_copie = x;
    while (x_copie != parinte[x_copie])
    {
        x_copie = parinte[x_copie];
    }

    int x_copie2 = x;
    while (x_copie2 != parinte[x_copie2])
    {
        x_copie2 = parinte[x_copie2];
        parinte[x_copie2] = x_copie;
    }

    int  y_copie = y;
    while (y_copie != parinte[y_copie])
    {
        y_copie = parinte[y_copie];
    }

    int y_copie2 = y;
    while (y_copie2 != parinte[y_copie2])
    {
        y_copie2 = parinte[y_copie2];
        parinte[y_copie2] = y_copie;
    }

    if (marime[x_copie] >= marime[y_copie])
    {
        parinte[y_copie] = x_copie;
        marime[x_copie] += marime[y_copie];
    }
    else
    {
        parinte[x_copie] = y_copie;
        marime[y_copie] += marime[x_copie];
    }
}

void operatie_2(int x, int y)
{
    int x_copie = x;
    while (x_copie != parinte[x_copie])
    {
        x_copie = parinte[x_copie];
    }

    int x_copie2 = x;
    while (x_copie2 != parinte[x_copie2])
    {
        x_copie2 = parinte[x_copie2];
        parinte[x_copie2] = x_copie;
    }

    int  y_copie = y;
    while (y_copie != parinte[y_copie])
    {
        y_copie = parinte[y_copie];
    }

    int y_copie2 = y;
    while (y_copie2 != parinte[y_copie2])
    {
        y_copie2 = parinte[y_copie2];
        parinte[y_copie2] = y_copie;
    }

    if (marime[x_copie] >= marime[y_copie])
    {
        parinte[y_copie] = x_copie;
        marime[x_copie] += marime[y_copie];
    }
    else
    {
        parinte[x_copie] = y_copie;
        marime[y_copie] += marime[x_copie];
    }

    if (x_copie == y_copie)
        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;
}