Pagini recente » Cod sursa (job #1197500) | Cod sursa (job #1613989) | Cod sursa (job #2524546) | Cod sursa (job #1040092) | Cod sursa (job #3330109)
#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;
// Cautam radacina
for(R = node;
radacina[R] != R;
R = radacina[R]);
// Compresia drumului
while(radacina[node] != node) {
int r = radacina[node];
radacina[node] = R;
node = r;
}
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(find_R(x), find_R(y));
}
else {
if(find_R(x) == find_R(y))
fout << "DA\n";
else
fout << "NU\n";
}
}
return 0;
}