Cod sursa(job #1607317)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 20 februarie 2016 23:28:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int N_max = 100002;

int tata[N_max];
int h[N_max];

int N, M;

int FIND(int x) // RETURNEAZA RADACINA NODULUI x
{
    int r, y;

    r = x;

    while(tata[r] != r) r = tata[r];

    while(tata[x] != x)
    {
        y = tata[x];

        tata[y] = r;

        x = y;
    }

    return r;
}

int UNION(int x, int y)
{
    int a = FIND(x);
    int b = FIND(y);

    if(h[a] < h[b]) tata[a] = b;
    else
    {
        tata[b] = a;

        if(h[a] == h[b]) h[a]++;
    }
}

int main()
{
    int i, cod, x, y;

    in >> N >> M;

    for(i = 1; i <= N; i++) tata[i] = i; // i E RADACINA

    for(i = 1; i <= M; i++)
    {
        in >> cod >> x >> y;

        if(cod == 1) // SE REUNESC MULTIMILE IN CARE SE AFLA x, RESPECTIV y
        {
            UNION(x, y);
        }
        else
        {
            int a = FIND(x);
            int b = FIND(y);

            if(a != b) out << "NU\n";
            else
                out << "DA\n";
        }
    }

    return 0;
}