Pagini recente » Cod sursa (job #431986) | Cod sursa (job #3357879) | Cod sursa (job #3345386) | Monitorul de evaluare | Cod sursa (job #3357976)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
vector<int> parent, rankk;
int findRoot(int x) {
if (parent[x] != x)
parent[x] = findRoot(parent[x]);
return parent[x];
}
void unionSets(int x, int y) {
int rx = findRoot(x);
int ry = findRoot(y);
if (rx == ry) return;
if (rankk[rx] < rankk[ry])
parent[rx] = ry;
else if (rankk[rx] > rankk[ry])
parent[ry] = rx;
else {
parent[ry] = rx;
rankk[rx]++;
}
}
int main() {
int N, M;
fin >> N >> M;
parent.resize(N + 1);
rankk.resize(N + 1, 0);
for (int i = 1; i <= N; i++)
parent[i] = i;
for (int i = 0; i < M; i++) {
int op, x, y;
fin >> op >> x >> y;
if (op == 1)
unionSets(x, y);
else {
if (findRoot(x) == findRoot(y))
fout << "DA\n";
else
fout << "NU\n";
}
}
fin.close();
fout.close();
return 0;
}