10   template <typename EdgeCostPair> static
 
    11   bool comparePair(EdgeCostPair const& a, EdgeCostPair const& b) {
 
    12     return a.second < b.second;
 
    16   template <typename Graph, typename EdgeDoubleMap, typename EdgeBoolMap>
 
    18   typename EdgeDoubleMap::ValueType 
 
    19   MinCostTreeKruskal(Graph const& G, EdgeDoubleMap const& costmap, 
 
    23     typedef typename EdgeDoubleMap::ValueType EDouble;
 
    24     typedef typename Graph::EachEdgeIt EachEdgeIt;
 
    25     typedef std::pair<EachEdgeIt, EDouble> EdgeCostPair;
 
    28     typedef std::vector<EdgeCostPair> EdgeCostVector;
 
    31     for (EachEdgeIt e=G.template first<EachEdgeIt>(); e.valid(); ++e) {
 
    32       rank.push_back(make_pair(e, costmap.get(e)));
 
    36     std::sort(rank.begin(), rank.end(), comparePair<EdgeCostPair>);
 
    38     typedef typename Graph::NodeMap<int> NodeIntMap;
 
    39     typedef typename Graph::NodeIt NodeIt;
 
    40     NodeIntMap comp_map(G, -1);
 
    41     UnionFind<NodeIt,NodeIntMap> uf(comp_map); 
 
    44     for (typename EdgeCostVector::iterator p = rank.begin(); 
 
    45 	 p!=rank.end(); ++p ) {
 
    46       if ( uf.joinComponents(G.head(p->first), G.tail(p->first)) ) {
 
    47 	treemap.set(p->first, true);
 
    48 	tot_cost += p->second;
 
    51 	treemap.set(p->first, false);
 
    60 #endif //HUGO_KRUSKAL_H