Pagini recente » Cod sursa (job #2925725) | Cod sursa (job #2904847) | Cod sursa (job #2754148) | Cod sursa (job #3148084) | Cod sursa (job #1435679)
// Paduri de multimi disjuncte - O(log*N) <=5
// op 1 - O(1) - reuneste multimile in care se afla x si y (din multimi diferite)
// op 2 - O(log*N) - sa se spuna daca x si y sunt in aceeasi mutlime
#include <fstream>
#define Nmax 100099
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
/* T[i] = radacina arborelui din care facce parte i */
int N, M, T[Nmax], rang[Nmax];
/* returneaza grupa din care face parte x
numele grupei este numele tatalui arborelui */
int gr(int x)
{
int R, y;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
for (R = x; T[R] != R; R = T[R]);
//aplic compresia drumurilor
for (; T[x] != x;)
{
y = T[x];
T[x] = R;
x = y;
}
return R;
}
void reunion(const int& x, const int& y){
/* T[gr(x)] = gr(y); */
int a = gr(x), b = gr(y);
if (rang[a] > rang[b]) {
T[b] = T[a];
} else {
T[a] = T[b];
}
if (rang[a] == rang[b]) rang[b]++;
}
int main()
{
f >>N >> M;
/* initializare - N multimi */
for(int i = 1; i <= N; ++i) T[i] = i , rang[i] = 1;
for(int i = 1; i <= M; ++i)
{
int op,x,y;
f >> op >> x >> y;
if(op == 1) {
reunion(x,y);
continue;
}
if(op == 2) {
if(gr(x) == gr(y)) g<<"DA\n";
else g<<"NU\n";
}
}
f.close();g.close();
return 0;
}