Cod sursa(job #1171135)

Utilizator andreiagAndrei Galusca andreiag Data 15 aprilie 2014 11:38:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <vector>

using namespace std;
const int Nmax = 100005;

int d[Nmax];    // radacina
int s[Nmax];    // marimea multimii

int parent(int x)
{
    while(d[x] != x)
    {
        d[x] = d[d[x]];
        x = d[x];
    }
    return x;
}

void join(int x, int y)
{
    int px = parent(x), py = parent(y);
    if (px != py)
    {
        if (s[px] >= s[py])
        {
            d[py] = px;
            s[px] += s[py];
        } else
        {
            d[px] = py;
            s[py] += s[px];
        }
    }
    return;
}

bool query(int x, int y)
{
    return parent(x) == parent(y);
}

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

    int N, M, o, x, y;
    f >> N >> M;
    for (int i = 0; i <= N; i++)
    {
        d[i] = i;
        s[i] = 1;
    }
    
    for (int i = 0; i < M; i++)
    {
        f >> o >> x >> y;
        if (o == 1)
            join(x,y);
        else if (o == 2)
                g << (query(x,y) ? "DA" : "NU") << '\n';
    }

    return 0;
}