Cod sursa(job #1607110)

Utilizator Vertex10Alexandru Pokharel Vertex10 Data 20 februarie 2016 20:30:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m, tata[100001], h[100001];

int find1 (int nod)
{
    if (tata[nod] == nod) //daca nodul la care am ajuns este radacina unui arbore
        return nod;
    return find1(tata[nod]); ///recursivitate la coada
}

int union1 (int x, int y)
{
    int a, b;
    a = find1(x); //a retine radacina arborelui in care se afla x
    b = find1(y);
    if (h[a]<h[b]) //voi lega arborele cu h mai mic la radacina aceluia mai adanc
        tata[a] = b;
    else
    {
        tata[b] = a;
        if (h[a]==h[b]) //daca cei doi arbori au aceeasi inaltime
            ++h[b];
    }
}

int main()
{
    int cod, x, y, a, b;
    f >> n >> m;
    for (int i=1; i<=n; ++i)
        tata[i] = i, h[i] = 1;
    for (int i=1; i<=m; ++i)
    {
        f >> cod >> x >> y;
        if (cod == 1)
            union1(x, y);
        else
        {
            a = find1(x);
            b = find1(y);
            if (a==b)
                g << "DA" << '\n';
            else
                g << "NU" << '\n';
        }
    }
    return 0;
}