Pagini recente » Atasamentele paginii Clasament wellcodesimulareav-10martie | Cod sursa (job #1552889) | Cod sursa (job #2135969) | Cod sursa (job #1741346) | Cod sursa (job #2073208)
#include <iostream>
#include <fstream>
#include <string>
#define NMAX 100003
using namespace std;
ifstream input("disjoint.in");
ofstream output("disjoint.out");
int points[NMAX];
int lengths[NMAX];
int rooter(int target) {
int root = target, temp;
while (root != points[root]) {
//points[root] = points[points[root]];
root = points[root];
}
while (points[root] != root) {
temp = points[target];
points[target] = root;
target = temp;
}
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;
}
else {
points[root1] = root2;
}
if (lengths[root1] == lengths[root2]) {
lengths[root2]++;
}
}
}
int main() {
int i, n, m;
input >> n >> m;
for (i = 1; i <= n; ++i) {
points[i] = i;
lengths[i] = 1;
}
int order, from, to;
for (i = 0; i < m; ++i) {
input >> order >> from >> to;
//lengths[points[i]]++;
if (order == 1) {
unite(rooter(from), rooter(to));
}
else {
if (rooter(from) == rooter(to)) {
output << "DA" << endl;
}
else {
output << "NU" << endl;
}
}
}
input.close();
output.close();
return 0;
}