Pagini recente » Cod sursa (job #2845993) | Cod sursa (job #1795975) | Cod sursa (job #362812) | Cod sursa (job #264806) | Cod sursa (job #3193356)
#include <iostream>
#include <fstream>
#define N_MAX 100005
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int v[N_MAX], nextElem[N_MAX], sizeSet[N_MAX];
int n, m;
void unite(int x, int y);
int find(int x);
void initializare (){
for (int i=1; i<=n; ++i){
v[i] = i;
nextElem[i] = i;
sizeSet[i] = 1;
}
}
void unite (int x, int y){
int setX, setY, i;
if (sizeSet[x] < sizeSet[y])
swap(x, y);
setX = find(x);
setY = find (y);
if (setX != setY){ // fac parte din multimi diferite
sizeSet[x] += sizeSet[y];
i = y;
do{
v[i] = setX;
i = nextElem[i]; // se duce tot la urmatorul element si il baga in multimea x
} while (i != y);
swap (nextElem[x], nextElem[y]); // what is this? what does this do?
}
}
int find (int x){
return v[x];
}
int main (){
in >> n >> m;
initializare();
int op, x, y;
for (int i=1; i<=m; ++i){
in >> op >> x >> y;
if (op == 1){
unite (x, y);
}
else{
if (find(x) == find(y))
out << "DA" << '\n';
else
out << "NU" << '\n';
}
}
return 0;
}