Pagini recente » Cod sursa (job #2092944) | Cod sursa (job #2549217) | Cod sursa (job #1913175) | Cod sursa (job #2282035) | Cod sursa (job #1824287)
#include <fstream>
#include <stdint.h>
struct node
{
node * parent;
int32_t rank;
};
void init_node(node * n)
{
n->parent = n;
n->rank = 0;
}
node * find_parent(node * n)
{
if (n != n->parent)
n->parent = find_parent(n->parent);
return n->parent;
}
void unite(node * n1, node * n2)
{
node * n1_parent = find_parent(n1);
node * n2_parent = find_parent(n2);
if (n1_parent->rank > n2_parent->rank)
n2_parent->parent = n1_parent;
else if (n1_parent->rank < n2_parent->rank)
n1_parent->parent = n2_parent;
else
{
n1_parent->parent = n2_parent;
++n2_parent->rank;
}
}
int main()
{
std::ifstream fin("disjoint.in");
std::ofstream fout("disjoint.out");
int32_t n, m, op_code, x, y;
fin>>n>>m;
node * nodes = new node[n];
for (int i = 0; i < n; ++i)
init_node(nodes + i);
for (int i = 0; i < m; ++i)
{
fin>>op_code>>x>>y;
if (op_code == 1)
unite(nodes+x-1, nodes+y-1);
else if (op_code == 2)
if (find_parent(nodes+x-1) == find_parent(nodes+y-1))
fout << "DA\n";
else
fout << "NU\n";
}
delete [] nodes;
fout.close();
fin.close();
return 0;
}