Pagini recente » Cod sursa (job #1130481) | Cod sursa (job #1578744) | Cod sursa (job #1287419) | Cod sursa (job #1804433) | Cod sursa (job #615086)
Cod sursa(job #615086)
#include <iostream>
#include <fstream>
#define INPUT "disjoint.in"
#define OUTPUT "disjoint.out"
#define MAX 100001
#define SUCCESS 0
using namespace std;
class Forest {
private:
int parent[MAX], rank[MAX];
public:
Forest(int n) {
for (int i = 0; i <= n; i++) {
parent[i] = i;
rank[i] = 0;
}
}
int find(int x) {
if (parent[x] == x) {
return x;
} else {
parent[x] = find(parent[x]);
return parent[x];
}
}
void unify(int x, int y) {
int root_x = find(x), root_y = find(y);
if (root_x != root_y) {
if (rank[root_x] <= rank[root_y]) {
parent[root_x] = root_y;
if (rank[root_x] == rank[root_y]) {
rank[root_y]++;
}
} else {
parent[root_y] = root_x;
}
}
}
};
int main() {
ifstream in(INPUT, ifstream::in);
ofstream out(OUTPUT, ofstream::out);
int n, m;
in >> n;
Forest forest(n);
in >> m;
for (int i = 0; i < m; i++) {
int op, x, y;
in >> op;
in >> x;
in >> y;
if (op == 1) {
forest.unify(x, y);
} else {
if (forest.find(x) == forest.find(y)) {
out << "DA\n";
} else {
out << "NU\n";
}
}
}
in.close();
out.flush();
out.close();
return SUCCESS;
}