OpenGM  2.3.x
Discrete Graphical Model Library
disjoint-set.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_DISJOINT_SET_HXX
3 #define OPENGM_DISJOINT_SET_HXX
4 
5 #include <map>
6 #include <vector>
7 #include <string>
8 #include <iostream>
9 
10 namespace opengm{
11 
12  template<class T= size_t>
13  class disjoint_set{
14 
15  public:
16 
17  typedef struct{
18  T rank;
19  T p;
20  T size;
21  }elem;
22 
23  disjoint_set(T);
24 
25  T find(T);
26  void join(T,T);
27  T size(T) ;
28  T numberOfSets() const;
29  void representativeLabeling(std::map<T, T>&) ;
30 
31  private:
32 
33  elem *elements_;
34  T numberOfElements_;
35  T numberOfSets_;
36 
37  };
38  // end Class
39 
40  template<class T>
42  i = find(i);
43  return elements_[i].size;
44  }
45 
46  template<class T>
47  disjoint_set<T>::disjoint_set(T numberOfElements){
48 
49  elements_ = new elem[numberOfElements];
50  numberOfElements_ = numberOfElements;
51  numberOfSets_ = numberOfElements;
52  for(T i=0;i < numberOfElements;++i){
53  elements_[i].rank = 0;
54  elements_[i].size=1;
55  elements_[i].p = i;
56  }
57  }
58 
59  template<class T>
61  T y = x;
62  while(y != elements_[y].p){
63  y=elements_[y].p;
64  }
65  elements_[x].p = y;
66  return y;
67 }
68 
69 template<class T>
70 void disjoint_set<T>::join(T x,T y){
71 
72  x = find(x);
73  y = find(y);
74 
75  if(x!=y){
76 
77  if(elements_[x].rank > elements_[y].rank){
78  elements_[y].p = x;
79  elements_[x].size += elements_[y].size;
80  }
81  else {
82  elements_[x].p = y;
83  elements_[y].size += elements_[x].size;
84  if(elements_[x].rank == elements_[y].rank){
85  elements_[y].rank++;
86  }
87  }
88  numberOfSets_--;
89 
90  }
91 
92 }
93 
94  template<class T>
96  return numberOfSets_;
97  }
98 
99  template<class T>
100  void disjoint_set<T>::representativeLabeling(std::map<T,T>& repL) {
101 
102  repL.clear();
103  T n=0;
104  for(T i=0;i<numberOfElements_;++i){
105  T x = find(i);
106  if(i==x){
107  repL[i]=n;
108  n++;
109  }
110  }
111  }
112 
113 }
114 
115 
116 #endif
The OpenGM namespace.
Definition: config.hxx:43
void representativeLabeling(std::map< T, T > &)