Pagini recente » Cod sursa (job #2531195) | Cod sursa (job #512298) | Cod sursa (job #517283) | Cod sursa (job #1095267) | Cod sursa (job #3233270)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
ifstream infile("disjoint.in");
ofstream outfile("disjoint.out");
class DisjointSet {
public:
DisjointSet(int n) {
parent.resize(n + 1);
rank.resize(n + 1, 0);
for (int i = 1; i <= n; ++i) {
parent[i] = i;
}
}
int find(int u) {
if (u != parent[u]) {
parent[u] = find(parent[u]); // Path compression
}
return parent[u];
}
void unite(int u, int v) {
int root_u = find(u);
int root_v = find(v);
if (root_u != root_v) {
if (rank[root_u] > rank[root_v]) {
parent[root_v] = root_u;
} else if (rank[root_u] < rank[root_v]) {
parent[root_u] = root_v;
} else {
parent[root_v] = root_u;
rank[root_u]++;
}
}
}
private:
vector<int> parent;
vector<int> rank;
};
int main() {
int N, M;
infile >> N >> M;
DisjointSet dsu(N);
for (int i = 0; i < M; ++i) {
int cod, x, y;
infile >> cod >> x >> y;
if (cod == 1) {
dsu.unite(x, y);
} else if (cod == 2) {
if (dsu.find(x) == dsu.find(y)) {
outfile << "DA\n";
} else {
outfile << "NU\n";
}
}
}
infile.close();
outfile.close();
return 0;
}