Pagini recente » Cod sursa (job #2462221) | Cod sursa (job #1130998) | Cod sursa (job #2729612) | Cod sursa (job #1853624) | Cod sursa (job #2945971)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int nrMultimi, nrOperatii, x, y, operatie, parinte[100001],grad[100001], rad_x, rad_y;
int cauta (int elem){
int root = elem;
while (parinte[elem] != elem)
elem = parinte[elem];
while (root != elem) {
parinte[root] = elem;
root = parinte[root]; //root = elem
}
return elem;
// parinte[elem] = root;
// return parinte[elem];
}
void reuniune (int x, int y){
rad_x = cauta(x);
rad_y = cauta(y);
if(grad[rad_x] > grad[rad_y]) {
parinte[rad_y] = rad_x;
grad[rad_x] = grad[rad_x] + grad[rad_y];
}
else {
parinte[rad_x] = rad_y;
grad[rad_y] = grad[rad_y] + grad[rad_x];
}
}
int main() {
fin >> nrMultimi >> nrOperatii;
for (int i = 1; i <= nrMultimi; ++i) {
parinte[i] = i;
grad[i] = 1;
}
for (int i = 1; i <= nrOperatii ; ++i) {
fin >> operatie >> x >> y;
if(operatie == 1)
reuniune(x, y);
else {
if(cauta(x) == cauta(y))
fout << "DA" << endl;
else
fout << "NU" << endl;
}
}
return 0;
}