Pagini recente » Cod sursa (job #1255745) | Cod sursa (job #3141576) | Profil linda | Cod sursa (job #2045286) | Cod sursa (job #1831440)
// Union-Find - Disjoint Sets - O(N + M lg*N)
#include <fstream>
using namespace std;
ifstream is("disjoint.in");
ofstream os("disjoint.out");
const int MAX_N = 100001;
const int MAX_M = 100001;
int Find(int node);
void Union(int firstNode, int secondNode);
void Init(int n);
int weight[MAX_N], root[MAX_N];
int main()
{
int n, m;
is >> n >> m;
Init(n);
for (int index = 0, op, firstNode, secondNode; index < m; ++index)
{
is >> op >> firstNode >> secondNode;
switch (op)
{
case 1:
Union(firstNode, secondNode);
break;
case 2:
os << (Find(firstNode) == Find(secondNode) ? "DA" : "NU") << '\n';
break;
}
}
return 0;
}
void Union(int firstNode, int secondNode)
{
int x = Find(firstNode);
int y = Find(secondNode);
if (weight[x] > weight[y])
root[y] = x;
else
{
root[x] = y;
if (weight[x] == weight[y])
weight[x]++;
}
}
int Find(int node)
{
if (node != root[node])
root[node] = Find(root[node]);
return root[node];
}
void Init(int n)
{
for (int i = 0; i < n; ++i)
{
root[i] = i;
weight[i] = 0;
}
}