Pagini recente » Cod sursa (job #2041594) | Cod sursa (job #2437707) | Cod sursa (job #2187522) | Cod sursa (job #1916276) | Cod sursa (job #3227342)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
class union_find
{
public:
int set_find(int n)
{
vector<int> xs;
while(n != _parent[n])
{
xs.push_back(n);
n = _parent[n];
}
for(const auto& x : xs)
{
_parent[x] = n;
}
return n;
}
void set_union(int a, int b)
{
a = set_find(a);
b = set_find(b);
if(a != b)
{
if(_size[a] < _size[b])
{
_parent[a] = b;
_size[b] += _size[a];
}
else
{
_parent[b] = a;
_size[a] += _size[b];
}
}
}
union_find(int n)
{
for(int i = 0; i <= n; i++)
{
_parent.push_back(i);
_size.push_back(1);
}
}
private:
vector<int> _parent;
vector<int> _size;
};
int main()
{
int n, m;
fin >> n >> m;
union_find uf(n);
for(int i = 1; i <= m; i++)
{
int t, a, b;
fin >> t >> a >> b;
if(t == 1)
{
uf.set_union(a, b);
}
else
{
fout << ((uf.set_find(a) == uf.set_find(b)) ? "DA" : "NU") << '\n';
}
}
}