Pagini recente » Cod sursa (job #84044) | Cod sursa (job #2584857) | Cod sursa (job #2391498) | Cod sursa (job #51657) | Cod sursa (job #1783521)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n,x,y,z,k;
class DisjointSet{
private:
struct Node{
int data;
Node* parent;
int _rank;
};
unordered_map<int,Node*> setDictionary;
public:
/*Creates a set with one element*/
void makeSet(int data){
Node* node = new Node();
node->data=data;
node->parent=node;
node->_rank=0;
setDictionary[data]=node;
}
/*
Find the representative recursively
Optimises the structure by path compression
*/
Node* findParent(Node* node){
Node* parent = node->parent;
if(parent==node)
return parent;
node->parent = findParent(node->parent); // Path compression
return node->parent;
}
/*
Display the representative of a node
*/
int findParent(int data){
Node* node = findParent(setDictionary[data]);
return node->data;
}
/*
Combines two sets into one
Union done by rank
*/
void unionSets(int data1, int data2){
Node* node1 = setDictionary[data1];
Node* node2 = setDictionary[data2];
Node* parent1 = findParent(node1);
Node* parent2 = findParent(node2);
if(parent1->data==parent2->data)
return;
/*Whoever's rank is higher becomes the new parent */
if(parent1->_rank>=parent2->_rank){
parent1->_rank = (parent1->_rank==parent2->_rank) ? parent1->_rank+1 : parent1->_rank;
parent2->parent = parent1;
}
else
parent1->parent=parent2;
}
};
int main()
{
fin>>n>>k;
DisjointSet wow;
for(int i=1;i<=n;i+=1)wow.makeSet(i);
for(int i=0;i<k;i+=1){
fin>>z;
switch(z){
case 1:
fin>>x>>y;
wow.unionSets(x,y);
break;
case 2:
fin>>x>>y;
if(wow.findParent(x)==wow.findParent(y))
fout<<"DA"<<'\n';
else
fout<<"NU"<<'\n';
}
}
return 0;
}