Pagini recente » Cod sursa (job #1687828) | Monitorul de evaluare | Cod sursa (job #2244278) | Cod sursa (job #1213246) | Cod sursa (job #2073177)
#include <iostream>
#include <fstream>
#include <string>
#define NMAX 100000
int points[NMAX];
int lengths[NMAX];
using namespace std;
int rooter(int target) {
int root = target;
while (root != points[root]) {
points[root] = points[points[root]];
root = points[root];
}
return root;
}
void unite(int point1, int point2) {
int root1 = rooter(point1);
int root2 = rooter(point2);
if (root1 != root2) {
if (lengths[root1] > lengths[root2]) {
points[root2] = root1;
lengths[root1] += lengths[root2];
}
else {
points[root1] = root2;
lengths[root2] += lengths[root1];
}
}
}
int main() {
ifstream input("disjoint.in");
ofstream output("disjoint.out");
int n, m;
input >> n >> m;
for (int i = 0; i < n; ++i) {
points[i] = i;
lengths[i] = 1;
}
int order, from, to;
for (int i = 0; i < m; ++i) {
input >> order >> from >> to;
if (order == 1) {
unite(rooter(from - 1), rooter(to - 1));
}
else {
if (rooter(from - 1) == rooter(to - 1)) {
output << "DA" << endl;
}
else {
output << "NU" << endl;
}
}
}
input.close();
output.close();
return 0;
}