src/hugo/tight_edge_filter_map.h
changeset 893 89d5c283a485
child 906 17f31d280385
equal deleted inserted replaced
-1:000000000000 0:851c71b2e80c
       
     1 // -*- C++ -*-
       
     2 #ifndef HUGO_TIGHT_EDGE_FILTER_MAP_H
       
     3 #define HUGO_TIGHT_EDGE_FILTER_MAP_H
       
     4 
       
     5 // /// \file
       
     6 // /// \brief Maximum flow algorithms.
       
     7 // /// \ingroup galgs
       
     8 
       
     9 namespace hugo {
       
    10 
       
    11   /// \brief A map for filtering the edge-set to those edges 
       
    12   /// which are tight w.r.t. some node_potential map and 
       
    13   /// edge_distance map.
       
    14   ///
       
    15   /// A node-map node_potential is said to be a potential w.r.t. 
       
    16   /// an edge-map edge_distance 
       
    17   /// if and only if for each edge e, node_potential[g.head(e)] 
       
    18   /// <= edge_distance[e]+node_potential[g.tail(e)] 
       
    19   /// (or the reverse inequality holds for each edge).
       
    20   /// An edge is said to be tight if this inequality holds with equality, 
       
    21   /// and the map returns true exactly for those edges.
       
    22   /// To avoid rounding errors, it is recommended to use this class with exact 
       
    23   /// types, e.g. with int.
       
    24   template<typename Graph, 
       
    25 	   typename NodePotentialMap, typename EdgeDistanceMap>
       
    26   class TightEdgeFilterMap {
       
    27   protected:
       
    28     const Graph* g;
       
    29     NodePotentialMap* node_potential;
       
    30     EdgeDistanceMap* edge_distance;
       
    31   public:
       
    32     TightEdgeFilterMap(Graph& _g, NodePotentialMap& _node_potential, 
       
    33 		       EdgeDistanceMap& _edge_distance) : 
       
    34       g(&_g), node_potential(&_node_potential), 
       
    35       edge_distance(&_edge_distance) { }
       
    36     bool operator[](const typename Graph::Edge& e) const {
       
    37       return ((*node_potential)[g->head(e)] == 
       
    38 	      (*edge_distance)[e]+(*node_potential)[g->tail(e)]);
       
    39     }
       
    40   };
       
    41 
       
    42 } //namespace hugo
       
    43 
       
    44 #endif //HUGO_TIGHT_EDGE_FILTER_MAP_H
       
    45 
       
    46