Cod sursa(job #2663594)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 26 octombrie 2020 20:44:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

using namespace std;

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

int n, m;
int parent[100001];
int h[100001];

void uneste(int x, int y)
{
    while (parent[x])
        x = parent[x];

    while (parent[y])
        y = parent[y];

    if (x == y)
        return;

    if (h[x] <= h[y])
    {
        parent[x] = y;
        h[y] = max(h[y], h[x] + 1);
    }
    else
    {
        parent[y] = x;
        h[x] = max(h[x], h[y] + 1);
    }
}

bool verif(int x, int y)
{
    int m1 = x, m2 = y;

    while (parent[m1])
        m1 = parent[m1];

    while (parent[m2])
        m2 = parent[m2];

    int aux;

    while (parent[x])
    {
        aux = x;
        x = parent[x];
        parent[aux] = m1;
    }

    while (parent[y])
    {
        aux = y;
        y = parent[y];
        parent[aux] = m2;
    }

    return (m1 == m2);
}

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

    for (int i=1; i<=n; i++)
        h[i] = 1;

    for (int i=1; i<=m; i++)
    {
        int tip, x, y;
        f >> tip >> x >> y;

        if (tip == 1)
            uneste(x, y);
        else
        {
            if (verif(x, y))
                g << "DA\n";
            else
                g << "NU\n";
        }
    }

    return 0;
}