Pagini recente » Cod sursa (job #3137722) | Cod sursa (job #2137311) | Cod sursa (job #2620662) | Cod sursa (job #2459326) | Cod sursa (job #2706234)
#include <fstream>
#include <map>
using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
struct Node
{
int dat;
int rnk;
Node *par;
Node() {}
Node(int dat, int rnk)
{
this->dat = dat;
this->rnk = rnk;
this->par = this;
}
Node(int dat, int rnk, Node *par)
{
this->dat = dat;
this->rnk = rnk;
this->par = par;
}
};
map <int, Node*> mp;
void makeSet(int dat)
{
Node *node = new Node(dat, 0);
mp.insert({dat, node});
}
Node* findPar(Node *node)
{
if(node->par == node)
return node;
Node *par = findPar(node->par);
node->par = par;
return par;
}
int findPar(int dat)
{
return findPar(mp[dat])->par->dat;
}
void unionSet(Node *node1, Node *node2)
{
Node *par1 = findPar(node1);
Node *par2 = findPar(node2);
if(par1 == par2)
return;
if(par1->rnk < par2->rnk)
swap(par1, par2);
par2->par = par1;
if(par1->rnk == par2->rnk)
++par1->rnk;
}
void unionSet(int node1, int node2)
{
unionSet(mp[node1], mp[node2]);
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i)
makeSet(i);
for(int i = 1; i <= m; ++i)
{
int a, b, c;
cin >> a >> b >> c;
if(a == 1)
unionSet(b, c);
else
{
if(findPar(b) == findPar(c))
cout << "DA\n";
else
cout << "NU\n";
}
}
return 0;
}