Cod sursa(job #447010)

Utilizator dcm9000Dinu Cristian Mircea - UPB dcm9000 Data 27 aprilie 2010 13:34:11
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

typedef struct
{
    int rang;
    int parinte;
} Disjoint;

static int multime(Disjoint sets[], int a)
{
    while (sets[sets[a].parinte].parinte != sets[a].parinte)
        sets[a].parinte = multime(sets, sets[a].parinte);

    return sets[a].parinte;
}

static inline void uneste(Disjoint sets[], int a, int b)
{
    int mulA = multime(sets, a);
    int mulB = multime(sets, b);

    if (mulA == mulB) return;

    if (sets[a].rang > sets[b].rang)
    {
        sets[b].parinte = a;
    }
    else if (sets[a].rang < sets[b].rang)
    {
        sets[a].parinte = b;
    }
    else
    {
        sets[b].parinte = a;
        sets[a].rang++;
    }
}

int main()
{
    int n, m;

    ifstream fisIn("disjoint.in");
    fisIn >> n >> m;

    ofstream fisOut("disjoint.out");

    Disjoint *sets = new Disjoint[n+1];
    for (int i=1; i<=n; i++)
    {
        sets[i].rang = 0;
        sets[i].parinte = i;
    }

    while (m--)
    {
        int op, a, b;
        fisIn >> op >> a >> b;

        if (op == 1)
        {
            uneste(sets,a,b);
        }
        else
        {
            fisOut << ((multime(sets,a) == multime(sets,b)) ? "DA\n" : "NU\n");
        }
    }
}