Pagini recente » Cod sursa (job #2660929) | Cod sursa (job #2085664) | Cod sursa (job #1038058) | Cod sursa (job #1512859) | Cod sursa (job #1806179)
#include <fstream>
#include <map>
using namespace std;
typedef struct _NODE
{
int rank;
int data;
_NODE* parent;
}NODE, *PNODE;
map<int, PNODE> disjointSet;
ifstream f{ "disjoint.in" };
ofstream q{ "disjoint.out" };
PNODE getNode(int data)
{
return disjointSet[data];
}
PNODE makeSet(int data)
{
PNODE newNode = new NODE();
newNode->rank = 0;
newNode->data = data;
newNode->parent = newNode;
return newNode;
}
PNODE findParent(PNODE root)
{
if (root->data == root->parent->data)
{
return root;
}
root->parent = findParent(root->parent);
return root->parent;
}
void unionSets(int x, int y)
{
PNODE xNode = getNode(x);
PNODE yNode = getNode(y);
PNODE parentX = findParent(xNode);
PNODE parentY = findParent(yNode);
if (parentX->data == parentY->data)
{
return;
}
if (parentX->rank >= parentY->rank)
{
if (parentX->rank == parentY->rank)
{
parentX->rank++;
}
parentY->parent = parentX;
}
else
{
parentX->parent = parentY;
}
}
int main()
{
int n, m, op, y, x;
f >> n >> m;
for (int i = 0; i <= n; ++i)
{
disjointSet[i] = makeSet(i);
}
for (int i = 0; i < m; ++i)
{
f >> op >> x >> y;
if (op == 1) unionSets(x, y);
else {
PNODE parentX = findParent(getNode(x));
PNODE parentY = findParent(getNode(y));
(parentX->data == parentY->data) ? q << "DA\n" : q << "NU\n";
}
}
f.close();
q.close();
return 0;
}