Pagini recente » Cod sursa (job #945114) | Cod sursa (job #837878) | Cod sursa (job #2668752) | Cod sursa (job #1042589) | Cod sursa (job #3330103)
#include <bits/stdc++.h>
std::ifstream fin("disjoint.in");
std::ofstream fout("disjoint.out");
int n, m;
std::vector<int> radacina, rang;
int find_R(int node) {
int R, x, y;
// Cautam radacina
for(R = node;
radacina[R] != R;
R = radacina[R])
// Compresia drumului
for(x = node, y = radacina[x];
radacina[x] != x;
radacina[x] = R, x = y, y = radacina[x])
return R;
}
void unite(int node_A, int node_B) {
if(rang[node_A] > rang[node_B]) {
radacina[node_B] = radacina[node_A];
}
else {
radacina[node_A] = radacina[node_B];
}
if(rang[node_A] == rang[node_B]) ++rang[node_B];
}
int main() {
fin >> n >> m;
radacina.resize(n + 1);
rang.resize(n + 1);
for(int i = 1; i <= n; ++i) {
radacina[i] = i;
rang[i] = 1;
}
while(m--) {
int op, x, y;
fin >> op >> x >> y;
if(op == 1) {
unite(x, y);
}
else {
if(find_R(x) == find_R(y))
fout << "DA\n";
else
fout << "NU\n";
}
}
return 0;
}