Skip to content

Commit 6920c6d

Browse files
committed
Add Disjoint-Sets.
1 parent d50073a commit 6920c6d

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

Disjoint-Sets/DisjointSet.hpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
struct Node {
2+
int rank, value;
3+
shared_ptr<Node> parent;
4+
};
5+
6+
class DisjointSet {
7+
public:
8+
map<int, shared_ptr<Node> > mp;
9+
void makeSet(int n) {
10+
shared_ptr<Node> nK = make_shared<Node>();
11+
nK->rank = 0;
12+
nK->value = n;
13+
nK->parent = nK;
14+
mp[n] = nK;
15+
return;
16+
}
17+
18+
shared_ptr<Node> findParentDriver(shared_ptr<Node> p) {
19+
if (p->parent == p)
20+
return p;
21+
22+
findParentDriver(p->parent);
23+
return p->parent;
24+
}
25+
26+
shared_ptr<Node> findParent(int n) {
27+
shared_ptr<Node> pt = this->mp[n];
28+
return findParentDriver(pt);
29+
}
30+
31+
bool Union(int a, int b) {
32+
shared_ptr nodeA = mp[a];
33+
shared_ptr nodeB = mp[b];
34+
35+
shared_ptr parentA = findParent(a);
36+
shared_ptr parentB = findParent(b);
37+
38+
if (parentA->value == parentB->value)
39+
return false;
40+
41+
if (parentA->rank >= parentB->rank) {
42+
parentB->parent = parentA;
43+
parentB->rank = (parentA->rank == parentB->rank) ? (parentB->rank + 1) : parentB->rank;
44+
} else {
45+
parentA->parent = parentB;
46+
}
47+
return true;
48+
}
49+
};
50+

Disjoint-Sets/Main.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include <map>
2+
#include <iostream>
3+
using namespace std;
4+
#include "DisjointSet.hpp"
5+
6+
int main() {
7+
DisjointSet *ds = new DisjointSet();
8+
9+
ds->makeSet(1);
10+
ds->makeSet(2);
11+
ds->makeSet(3);
12+
ds->makeSet(4);
13+
14+
ds->Union(1, 2);
15+
16+
cout << ds->findParent(2).get()->value << endl;
17+
}
18+

Disjoint-Sets/a.out

62.8 KB
Binary file not shown.

0 commit comments

Comments
 (0)