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