Pagini recente » Cod sursa (job #3256991) | Cod sursa (job #2948850) | Cod sursa (job #1735827) | Cod sursa (job #2198816) | Cod sursa (job #2806751)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
vector<int> rad(100000);
vector<int> rang(100000);
int find(int x) {
int i, y;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
i=x;
while(rad[i]!=i){
i=rad[i];
}
//aplic compresia drumurilor
while(rad[x]!=x) {
y = rad[x];
rad[x] = i;
x = y;
}
return i;
}
void unite(int x, int y) {
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (rang[x] > rang[y])
rad[y] = x;
else rad[x] = y;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if (rang[x] == rang[y]) rang[y]++;
}
int main() {
int n, m;
f >> n >> m;
for(int i = 1 ; i <= n ; ++i){
rang[i]=1;
rad[i]=i;
}
for (int i = 0; i < m; ++i) {
int x, y, z;
f >> x >> y >> z;
if (x == 1) {
unite(y, z);
}
else {
if (x == 2) {
if (find(y) == find(z)) {
g << "DA" << '\n';
} else {
g << "NU" << '\n';
}
}
}
}
return 0;
}