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   // end Class
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Generated on Mon Jun 17 16:31:02 2013 for OpenGM by  doxygen 1.6.3