Pagini recente » Cod sursa (job #1128778) | Cod sursa (job #2817244) | Cod sursa (job #1693575) | Cod sursa (job #1264441) | Cod sursa (job #1880424)
// 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");
/* root[i] = radacina arborelui din care facce parte i */
int n, m, root[Nmax];
/* returneaza root din componenta conexa din care face parte x*/
int getroot(int x) {
if(root[x] != x) {
root[x] = getroot(root[x]);
}
return root[x];
}
void reunion(int x, int y)
{
root[ getroot(y) ] = getroot(x);
}
int main()
{
f >>n >> m;
/* initializare - n multimi */
for(int i = 1; i <= n; ++i) root[i] = i;
for(int i = 1; i <= m; ++i)
{
int op,x,y;
f >> op >> x >> y;
if(op == 1) {
reunion(x,y);
}
if(op == 2) {
if(getroot(x) == getroot(y)) g<<"DA\n";
else g<<"NU\n";
}
}
f.close();g.close();
return 0;
}