Cod sursa(job #1981324)

Utilizator robertstrecheStreche Robert robertstreche Data 15 mai 2017 13:38:00
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>

#define NMAX 100001

using namespace std;

int dad[NMAX], elem_number[NMAX];

inline void reuniune(int x, int y) {

    if (elem_number[dad[x]] <= elem_number[dad[y]]){
        elem_number[dad[x]] += elem_number[dad[y]];
        dad[y] = dad[x];
    }
    else {
        elem_number[dad[y]] += elem_number[dad[x]];
        dad[x] = dad[y];
    }

    return;
}

inline bool request(int x, int y){

    int aux, xx = x, yy = y;

    while (x != dad[x])
        x = dad[x];

    while (xx != x){
        aux = dad[xx];
        dad[xx] = x;
        xx = aux;
    }

    while (y != dad[y])
        y = dad[y];

    while (yy != y){
        aux = dad[yy];
        dad[yy] = y;
        yy = aux;
    }

    return x == y;

}

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

    int n, m, type, x, y;

    f >> n >> m;

    for (int i = 1; i <= n; i++)
        dad[i] = i, elem_number[i] = 1;

    for (int i = 0; i < m; i++) {

        f >> type >> x >> y;

        if (type == 1)
            reuniune(x, y);
        else
            if (request(x, y) == 0)
                g << "NU\n";
            else
                g << "DA\n";
    }

    f.close();
    g.close();

    return 0;
}