| 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 | |
|---|