disjoint-set.hxx
Go to the documentation of this file.00001 #pragma once
00002 #ifndef OPENGM_DISJOINT_SET_HXX
00003 #define OPENGM_DISJOINT_SET_HXX
00004
00005 #include <map>
00006 #include <vector>
00007 #include <string>
00008 #include <iostream>
00009
00010 namespace opengm{
00011
00012 template<class T= size_t>
00013 class disjoint_set{
00014
00015 public:
00016
00017 typedef struct{
00018 T rank;
00019 T p;
00020 T size;
00021 }elem;
00022
00023 disjoint_set(T);
00024
00025 T find(T);
00026 void join(T,T);
00027 T size(T) ;
00028 T numberOfSets() const;
00029 void representativeLabeling(std::map<T, T>&) ;
00030
00031 private:
00032
00033 elem *elements_;
00034 T numberOfElements_;
00035 T numberOfSets_;
00036
00037 };
00038
00039
00040 template<class T>
00041 T disjoint_set<T>::size(T i) {
00042 i = find(i);
00043 return elements_[i].size;
00044 }
00045
00046 template<class T>
00047 disjoint_set<T>::disjoint_set(T numberOfElements){
00048
00049 elements_ = new elem[numberOfElements];
00050 numberOfElements_ = numberOfElements;
00051 numberOfSets_ = numberOfElements;
00052 for(T i=0;i < numberOfElements;++i){
00053 elements_[i].rank = 0;
00054 elements_[i].size=1;
00055 elements_[i].p = i;
00056 }
00057 }
00058
00059 template<class T>
00060 T disjoint_set<T>::find(T x){
00061 T y = x;
00062 while(y != elements_[y].p){
00063 y=elements_[y].p;
00064 }
00065 elements_[x].p = y;
00066 return y;
00067 }
00068
00069 template<class T>
00070 void disjoint_set<T>::join(T x,T y){
00071
00072 x = find(x);
00073 y = find(y);
00074
00075 if(x!=y){
00076
00077 if(elements_[x].rank > elements_[y].rank){
00078 elements_[y].p = x;
00079 elements_[x].size += elements_[y].size;
00080 }
00081 else {
00082 elements_[x].p = y;
00083 elements_[y].size += elements_[x].size;
00084 if(elements_[x].rank == elements_[y].rank){
00085 elements_[y].rank++;
00086 }
00087 }
00088 numberOfSets_--;
00089
00090 }
00091
00092 }
00093
00094 template<class T>
00095 T disjoint_set<T>::numberOfSets() const{
00096 return numberOfSets_;
00097 }
00098
00099 template<class T>
00100 void disjoint_set<T>::representativeLabeling(std::map<T,T>& repL) {
00101
00102 repL.clear();
00103 T n=0;
00104 for(T i=0;i<numberOfElements_;++i){
00105 T x = find(i);
00106 if(i==x){
00107 repL[i]=n;
00108 n++;
00109 }
00110 }
00111 }
00112
00113 }
00114
00115
00116 #endif