Cod sursa(job #2277291)

Utilizator alexnigaNiga Alexandru alexniga Data 5 noiembrie 2018 23:05:10
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 100001

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

int tata[NMAX], inaltime[NMAX];

int verfrad( int x)
{
    int rad = x, aux;

    while (tata[rad] != rad)
        rad = tata[rad];

    while (tata[x] != x)
    {
        aux = tata[x];
        tata[x] = rad;
        x = aux;
    }

    return rad;

}

void uneste(int x, int y)
{
    if(inaltime[x] > inaltime[y])
        tata[y] = x;
    else
        tata[x] = y;

    if(inaltime[x] == inaltime[y])
        inaltime[y]++;
}

int main()
{
    int k, n, m, i, x, y;

    f >> n >> m;

    for (i = 1; i <= n; i++)
    {
        tata[i] = i;
        inaltime[i] = 1;
    }

    for (i = 1; i <= m; i++)
    {
        f >> k >> x >> y;
        if (k == 2)
        {
            if ( verfrad(x) == verfrad(y))
                g << "DA" << "\n";
            else
                g << "NU" << "\n";
        }
        else
            uneste(verfrad(x), verfrad(y));
    }

	return 0;
}