disjoint_sets.h
Go to the documentation of this file.
1 #include <iostream>
2 #include <map>
3 #include <vector>
4 
5 #pragma once
6 
7 namespace alglib {
8 namespace disjoint_sets {
9 
10 
11 template<typename elt_type>
13 
14  private:
15  std::vector<int> parent;
16 
17  /* Translate to int */
18  std::map<elt_type, int> eltid;
19 
20  /* Number of elements in the disjoint set */
21  int elts;
22 
23  public:
24  disjoint_sets() : elts(0) {}
25  void union_set(const elt_type& e1, const elt_type& e2);
26  int find_set(const elt_type& e);
27  int find_set_by_id(int id);
28  void make_set(const elt_type& e);
29  bool same_set(const elt_type& e1, const elt_type& e2);
30  int set_count();
31  int set_size(const elt_type& e);
32 };
33 
34 tempate <typename elt_type>
35 int disjoint_set<elt_type>::find_set_by_id(int id) {
36 
37  if (id == parent[id])
38  return id;
39 
40  return parent[id] = find_set_by_id(parent[id]); // Path compression
41 }
42 
43 template <typename elt_type>
44 void disjoint_sets<elt_type>::make_set(const elt_type& e) {
45 
46  eltid[e] = elts;
47  parent[elts] = elts;
48  ++elts;
49 }
50 
51 template <typename elt_type>
52 int disjoint_sets<elt_type>::find_set(const elt_type& e) {
53 
54  return find_set_by_id(eltid[e]);
55 }
56 
57 template <typename elt_type>
58 void disjoint_sets<elt_type>::union_set(const elt_type& e1, const elt_type& e2) {
59 
60  int repr_id1 = find_set(e1);
61  int repr_id2 = find_set(e2);
62  parent[repr_id1] = repr_id2;
63 }
64 
65 template <typename elt_type>
66 bool disjoint_set<elt_type>::same_set(const elt_type& e1, const elt_type& e2) {
67 
68  return find_set(eltid[e1]) == find_set(eltid[e2]);
69 }
70 
71 template <typename elt_type>
72 int disjoint_set<elt_type>::set_count() {
73 
74 }
75 
76 template <typename elt_type>
77 int disjoint_set<elt_type>::set_count() {
78 
79 }
80 
81 }; // end disjoint_set namespace
82 }; // end alglib namespace
void make_set(const elt_type &e)
Definition: disjoint_sets.h:44
bool same_set(const elt_type &e1, const elt_type &e2)
void union_set(const elt_type &e1, const elt_type &e2)
Definition: disjoint_sets.h:58
Definition: bimap.h:17
Definition: disjoint_sets.h:12
int find_set(const elt_type &e)
Definition: disjoint_sets.h:52
int set_size(const elt_type &e)
disjoint_sets()
Definition: disjoint_sets.h:24