Pagini recente » Cod sursa (job #801591) | Cod sursa (job #419892) | Cod sursa (job #401) | Cod sursa (job #2945999) | Cod sursa (job #3264361)
#include <fstream>
#include <vector>
std::vector<int> parent;
std::vector<int> rank;
int find(const int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void unite(const int x, const int y) {
const int rootX = find(x);
const int rootY = find(y);
if (rootX == rootY)
return;
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else {
parent[rootX] = rootY;
if (rank[rootX] == rank[rootY]) {
rank[rootY]++;
}
}
}
int main() {
std::ifstream fin("disjoint.in");
std::ofstream fout("disjoint.out");
int N, M;
fin >> N >> M;
parent.resize(N + 1);
rank.resize(N + 1, 1);
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
for (int i = 1; i <= M; i++) {
int command, x, y;
fin >> command >> x >> y;
if (command == 2) {
fout << (find(x) == find(y) ? "DA" : "NU") << '\n';
} else {
if (find(x) == find(y)) {
return 0;
}
unite(x, y);
}
}
return 0;
}