Limbo 3.5.4
Loading...
Searching...
No Matches
DisjointSet.h
Go to the documentation of this file.
1
12
13#ifndef LIMBO_CONTAINERS_DISJOINTSET_H
14#define LIMBO_CONTAINERS_DISJOINTSET_H
15
16#include <vector>
17#include <algorithm>
18
20namespace limbo
21{
23namespace containers
24{
25
29{
35 template <typename SubsetHelperType>
36 static typename SubsetHelperType::element_type const& find_set(SubsetHelperType const& gp, typename SubsetHelperType::element_type const& e)
37 {
38 if (gp.get_parent(e) == e) // if e is its own parent, it reaches to the top set
39 return e;
40 return find_set(gp, gp.get_parent(e));
41 }
42
48 template <typename SubsetHelperType>
49 static void union_set(SubsetHelperType& gp, typename SubsetHelperType::element_type const& e1, typename SubsetHelperType::element_type const& e2)
50 {
51 typename SubsetHelperType::element_type const& root1 = find_set(gp, e1);
52 typename SubsetHelperType::element_type const& root2 = find_set(gp, e2);
53 // set parent
54 if (gp.get_rank(root1) < gp.get_rank(root2))
55 gp.set_parent(root1, root2);
56 else if (gp.get_rank(root1) > gp.get_rank(root2))
57 gp.set_parent(root2, root1);
58 else
59 {
60 gp.set_parent(root2, root1);
61 gp.set_rank(root1, gp.get_rank(root1)+1);
62 }
63 }
64
68 template <typename SubsetHelperType>
69 static std::size_t count_sets(SubsetHelperType const& gp)
70 {
71 std::size_t count = 0;
72 for (typename SubsetHelperType::element_type i = 0, ie = gp.size(); i != ie; ++i)
73 if (gp.get_parent(i) == i) // top subset
74 ++count;
75 return count;
76 }
77
82 template <typename ElementType, typename RankType>
84 {
86 typedef ElementType element_type;
87 typedef RankType rank_type;
89
90 std::vector<element_type>& vParent;
91 std::vector<rank_type>& vRank;
92
96 SubsetHelper(std::vector<element_type>& vp, std::vector<rank_type>& vr)
97 : vParent(vp)
98 , vRank(vr)
99 {
100 // set initial parent to every vertex itself
101 for (unsigned int i = 0, ie = vParent.size(); i != ie; ++i)
102 vParent[i] = i;
103 std::fill(vRank.begin(), vRank.end(), 0);
104 }
105
108 inline element_type const& get_parent(element_type const& e) const {return vParent[e];}
112 inline void set_parent(element_type const& e, element_type const& p) {vParent[e] = p;}
116 inline rank_type const& get_rank(element_type const& e) const {return vRank[e];}
120 inline void set_rank(element_type const& e, rank_type const& r) {vRank[e] = r;}
122 inline std::size_t size() const {return vParent.size();}
123 };
124};
125
126}} // namespace limbo // namespace containers
127
128#endif
namespace for Limbo.Containers
Definition DisjointSet.h:24
namespace for Limbo
element_type const & get_parent(element_type const &e) const
get parent element
void set_parent(element_type const &e, element_type const &p)
set parent element
std::vector< rank_type > & vRank
reference to rank array
Definition DisjointSet.h:91
std::vector< element_type > & vParent
reference to parent array
Definition DisjointSet.h:90
void set_rank(element_type const &e, rank_type const &r)
set rank
SubsetHelper(std::vector< element_type > &vp, std::vector< rank_type > &vr)
constructor
Definition DisjointSet.h:96
rank_type const & get_rank(element_type const &e) const
get rank
simply used for scope control
Definition DisjointSet.h:29
static SubsetHelperType::element_type const & find_set(SubsetHelperType const &gp, typename SubsetHelperType::element_type const &e)
find the subset of an element e
Definition DisjointSet.h:36
static void union_set(SubsetHelperType &gp, typename SubsetHelperType::element_type const &e1, typename SubsetHelperType::element_type const &e2)
union two subsets represented by element e1 and e2
Definition DisjointSet.h:49
static std::size_t count_sets(SubsetHelperType const &gp)
Definition DisjointSet.h:69