Pagini recente » Cod sursa (job #1657988) | Cod sursa (job #2716974) | Cod sursa (job #2305950) | Cod sursa (job #1465266) | Cod sursa (job #3252765)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
struct DisjointSet {
vector<int> parent, rank;
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 x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
// Union two sets by rank
void unite(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
}
}
bool sameSet(int x, int y) {
return find(x) == find(y);
}
};
int main() {
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N, M;
fin >> N >> M;
DisjointSet dsu(N);
for (int i = 0; i < M; ++i) {
int code, x, y;
fin >> code >> x >> y;
if (code == 1) {
dsu.unite(x, y);
} else if (code == 2) {
if (dsu.sameSet(x, y)) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
}
return 0;
}