Cod sursa(job #1878321)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 14 februarie 2017 00:38:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
int father[NMAX], rang[NMAX], n, m;

inline int max(int x, int y)
{
    return x > y ? x : y;
}

inline int Father(int x)
{
    while (father[x] != -1) x = father[x];
    return x;
}
void Actualizare(int f, int x)
{
    if (f == x) return;
    Actualizare(f, father[x]);
    father[x] = f;
}
void Write()
{
    for (int i = 1; i <= n; i++)
        cout<<father[i]<<' ';
    cout<<'\n';
}
int main()
{
    f>>n>>m;
    for (int i = 1; i <= n; i++)
    {
        father[i] = -1; // radacina
        rang[i] = 1;
    }
    for (int p, x, y, i = 1; i <= m; i++)
    {
        f>>p>>x>>y;
        int f1 = Father(x);
        int f2 = Father(y);
        //Write();
        if (p == 1) // actualizare
        {
            if (rang[f1] < rang[f2])
                swap(f1, f2);
            father[f2] = f1;
            rang[f1] = max(rang[f1], rang[f2] + 1);
        }
        else // interogare
        {
            if (f1 == f2)
                g<<"DA\n";
            else g<<"NU\n";
            Actualizare(f1, x);
            Actualizare(f2, y);
        }
    }
    return 0;
}