Cod sursa(job #1613643)

Utilizator roxannemafteiuMafteiu-Scai Roxana roxannemafteiu Data 25 februarie 2016 15:45:11
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int n, m, t, x, y;
int father[NMAX], height[NMAX];

void read()
{
    f >> n >> m;
}

void init()
{
    for(int i = 1; i <=n; ++i)
    {
        //initial fiecare nod pointeaza catre el insusi
        father[i] = i;
        height[i] = i;
    }
}

int root(int x)
{
    if (father[x] == x) return x;
    father[x] = root(father[x]);
    return father[x];
}

void unite(int a, int b)
{
    a = root(a);
    b = root(b);
    if (height[b] > height[a]) father[a] = b;
    else father[b] = a;
    if (height[a] == height[b]) height[a]++;
}

bool are_united(int a, int b)
{
    return root(a) == root(b);
}

void solve()
{
    for(int i = 1; i <= m; ++i)
    {
        f >> t >> x >> y;
        if(t == 1) unite(x, y);
        else
        {
            if(are_united(x, y))
                g << "Da\n";
            else
                g << "Nu\n";
        }
    }
}

int main()
{
    read();
    init();
    solve();
    return 0;
}