31 #include <lemon/bits/undir_graph_extender.h> |
31 #include <lemon/bits/undir_graph_extender.h> |
32 #include <iostream> |
32 #include <iostream> |
33 |
33 |
34 namespace lemon { |
34 namespace lemon { |
35 |
35 |
36 // Graph wrappers |
36 // Graph adaptors |
37 |
37 |
38 /*! |
38 /*! |
39 \addtogroup gwrappers |
39 \addtogroup graph_adaptors |
40 @{ |
40 @{ |
41 */ |
41 */ |
42 |
42 |
43 /*! |
43 /*! |
44 Base type for the Graph Wrappers |
44 Base type for the Graph Adaptors |
45 |
45 |
46 \warning Graph wrappers are in even more experimental state than the other |
46 \warning Graph adaptors are in even more experimental state than the other |
47 parts of the lib. Use them at you own risk. |
47 parts of the lib. Use them at you own risk. |
48 |
48 |
49 This is the base type for most of LEMON graph wrappers. |
49 This is the base type for most of LEMON graph adaptors. |
50 This class implements a trivial graph wrapper i.e. it only wraps the |
50 This class implements a trivial graph adaptor i.e. it only wraps the |
51 functions and types of the graph. The purpose of this class is to |
51 functions and types of the graph. The purpose of this class is to |
52 make easier implementing graph wrappers. E.g. if a wrapper is |
52 make easier implementing graph adaptors. E.g. if an adaptor is |
53 considered which differs from the wrapped graph only in some of its |
53 considered which differs from the wrapped graph only in some of its |
54 functions or types, then it can be derived from GraphWrapper, and only the |
54 functions or types, then it can be derived from GraphAdaptor, and only the |
55 differences should be implemented. |
55 differences should be implemented. |
56 |
56 |
57 \author Marton Makai |
57 \author Marton Makai |
58 */ |
58 */ |
59 template<typename _Graph> |
59 template<typename _Graph> |
60 class GraphWrapperBase { |
60 class GraphAdaptorBase { |
61 public: |
61 public: |
62 typedef _Graph Graph; |
62 typedef _Graph Graph; |
63 /// \todo Is it needed? |
63 /// \todo Is it needed? |
64 typedef Graph BaseGraph; |
64 typedef Graph BaseGraph; |
65 typedef Graph ParentGraph; |
65 typedef Graph ParentGraph; |
66 |
66 |
67 protected: |
67 protected: |
68 Graph* graph; |
68 Graph* graph; |
69 GraphWrapperBase() : graph(0) { } |
69 GraphAdaptorBase() : graph(0) { } |
70 void setGraph(Graph& _graph) { graph=&_graph; } |
70 void setGraph(Graph& _graph) { graph=&_graph; } |
71 |
71 |
72 public: |
72 public: |
73 GraphWrapperBase(Graph& _graph) : graph(&_graph) { } |
73 GraphAdaptorBase(Graph& _graph) : graph(&_graph) { } |
74 |
74 |
75 typedef typename Graph::Node Node; |
75 typedef typename Graph::Node Node; |
76 typedef typename Graph::Edge Edge; |
76 typedef typename Graph::Edge Edge; |
77 |
77 |
78 void first(Node& i) const { graph->first(i); } |
78 void first(Node& i) const { graph->first(i); } |
110 |
110 |
111 template <typename _Value> |
111 template <typename _Value> |
112 class NodeMap : public _Graph::template NodeMap<_Value> { |
112 class NodeMap : public _Graph::template NodeMap<_Value> { |
113 public: |
113 public: |
114 typedef typename _Graph::template NodeMap<_Value> Parent; |
114 typedef typename _Graph::template NodeMap<_Value> Parent; |
115 NodeMap(const GraphWrapperBase<_Graph>& gw) : Parent(*gw.graph) { } |
115 NodeMap(const GraphAdaptorBase<_Graph>& gw) : Parent(*gw.graph) { } |
116 NodeMap(const GraphWrapperBase<_Graph>& gw, const _Value& value) |
116 NodeMap(const GraphAdaptorBase<_Graph>& gw, const _Value& value) |
117 : Parent(*gw.graph, value) { } |
117 : Parent(*gw.graph, value) { } |
118 }; |
118 }; |
119 |
119 |
120 template <typename _Value> |
120 template <typename _Value> |
121 class EdgeMap : public _Graph::template EdgeMap<_Value> { |
121 class EdgeMap : public _Graph::template EdgeMap<_Value> { |
122 public: |
122 public: |
123 typedef typename _Graph::template EdgeMap<_Value> Parent; |
123 typedef typename _Graph::template EdgeMap<_Value> Parent; |
124 EdgeMap(const GraphWrapperBase<_Graph>& gw) : Parent(*gw.graph) { } |
124 EdgeMap(const GraphAdaptorBase<_Graph>& gw) : Parent(*gw.graph) { } |
125 EdgeMap(const GraphWrapperBase<_Graph>& gw, const _Value& value) |
125 EdgeMap(const GraphAdaptorBase<_Graph>& gw, const _Value& value) |
126 : Parent(*gw.graph, value) { } |
126 : Parent(*gw.graph, value) { } |
127 }; |
127 }; |
128 |
128 |
129 }; |
129 }; |
130 |
130 |
131 template <typename _Graph> |
131 template <typename _Graph> |
132 class GraphWrapper : |
132 class GraphAdaptor : |
133 public IterableGraphExtender<GraphWrapperBase<_Graph> > { |
133 public IterableGraphExtender<GraphAdaptorBase<_Graph> > { |
134 public: |
134 public: |
135 typedef _Graph Graph; |
135 typedef _Graph Graph; |
136 typedef IterableGraphExtender<GraphWrapperBase<_Graph> > Parent; |
136 typedef IterableGraphExtender<GraphAdaptorBase<_Graph> > Parent; |
137 protected: |
137 protected: |
138 GraphWrapper() : Parent() { } |
138 GraphAdaptor() : Parent() { } |
139 |
139 |
140 public: |
140 public: |
141 GraphWrapper(Graph& _graph) { setGraph(_graph); } |
141 GraphAdaptor(Graph& _graph) { setGraph(_graph); } |
142 }; |
142 }; |
143 |
143 |
144 template <typename _Graph> |
144 template <typename _Graph> |
145 class RevGraphWrapperBase : public GraphWrapperBase<_Graph> { |
145 class RevGraphAdaptorBase : public GraphAdaptorBase<_Graph> { |
146 public: |
146 public: |
147 typedef _Graph Graph; |
147 typedef _Graph Graph; |
148 typedef GraphWrapperBase<_Graph> Parent; |
148 typedef GraphAdaptorBase<_Graph> Parent; |
149 protected: |
149 protected: |
150 RevGraphWrapperBase() : Parent() { } |
150 RevGraphAdaptorBase() : Parent() { } |
151 public: |
151 public: |
152 typedef typename Parent::Node Node; |
152 typedef typename Parent::Node Node; |
153 typedef typename Parent::Edge Edge; |
153 typedef typename Parent::Edge Edge; |
154 |
154 |
155 // using Parent::first; |
155 // using Parent::first; |
177 /// ListGraph g; |
177 /// ListGraph g; |
178 /// \endcode |
178 /// \endcode |
179 /// For each directed edge |
179 /// For each directed edge |
180 /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by |
180 /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by |
181 /// reversing its orientation. |
181 /// reversing its orientation. |
182 /// Then RevGraphWrapper implements the graph structure with node-set |
182 /// Then RevGraphAdaptor implements the graph structure with node-set |
183 /// \f$V\f$ and edge-set |
183 /// \f$V\f$ and edge-set |
184 /// \f$\{\bar e : e\in A \}\f$, i.e. the graph obtained from \f$G\f$ be |
184 /// \f$\{\bar e : e\in A \}\f$, i.e. the graph obtained from \f$G\f$ be |
185 /// reversing the orientation of its edges. The following code shows how |
185 /// reversing the orientation of its edges. The following code shows how |
186 /// such an instance can be constructed. |
186 /// such an instance can be constructed. |
187 /// \code |
187 /// \code |
188 /// RevGraphWrapper<ListGraph> gw(g); |
188 /// RevGraphAdaptor<ListGraph> gw(g); |
189 /// \endcode |
189 /// \endcode |
190 ///\author Marton Makai |
190 ///\author Marton Makai |
191 template<typename _Graph> |
191 template<typename _Graph> |
192 class RevGraphWrapper : |
192 class RevGraphAdaptor : |
193 public IterableGraphExtender<RevGraphWrapperBase<_Graph> > { |
193 public IterableGraphExtender<RevGraphAdaptorBase<_Graph> > { |
194 public: |
194 public: |
195 typedef _Graph Graph; |
195 typedef _Graph Graph; |
196 typedef IterableGraphExtender< |
196 typedef IterableGraphExtender< |
197 RevGraphWrapperBase<_Graph> > Parent; |
197 RevGraphAdaptorBase<_Graph> > Parent; |
198 protected: |
198 protected: |
199 RevGraphWrapper() { } |
199 RevGraphAdaptor() { } |
200 public: |
200 public: |
201 RevGraphWrapper(_Graph& _graph) { setGraph(_graph); } |
201 RevGraphAdaptor(_Graph& _graph) { setGraph(_graph); } |
202 }; |
202 }; |
203 |
203 |
204 |
204 |
205 template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap> |
205 template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap> |
206 class SubGraphWrapperBase : public GraphWrapperBase<_Graph> { |
206 class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> { |
207 public: |
207 public: |
208 typedef _Graph Graph; |
208 typedef _Graph Graph; |
209 typedef GraphWrapperBase<_Graph> Parent; |
209 typedef GraphAdaptorBase<_Graph> Parent; |
210 protected: |
210 protected: |
211 NodeFilterMap* node_filter_map; |
211 NodeFilterMap* node_filter_map; |
212 EdgeFilterMap* edge_filter_map; |
212 EdgeFilterMap* edge_filter_map; |
213 SubGraphWrapperBase() : Parent(), |
213 SubGraphAdaptorBase() : Parent(), |
214 node_filter_map(0), edge_filter_map(0) { } |
214 node_filter_map(0), edge_filter_map(0) { } |
215 |
215 |
216 void setNodeFilterMap(NodeFilterMap& _node_filter_map) { |
216 void setNodeFilterMap(NodeFilterMap& _node_filter_map) { |
217 node_filter_map=&_node_filter_map; |
217 node_filter_map=&_node_filter_map; |
218 } |
218 } |
219 void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) { |
219 void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) { |
220 edge_filter_map=&_edge_filter_map; |
220 edge_filter_map=&_edge_filter_map; |
221 } |
221 } |
222 |
222 |
223 public: |
223 public: |
224 // SubGraphWrapperBase(Graph& _graph, |
224 // SubGraphAdaptorBase(Graph& _graph, |
225 // NodeFilterMap& _node_filter_map, |
225 // NodeFilterMap& _node_filter_map, |
226 // EdgeFilterMap& _edge_filter_map) : |
226 // EdgeFilterMap& _edge_filter_map) : |
227 // Parent(&_graph), |
227 // Parent(&_graph), |
228 // node_filter_map(&node_filter_map), |
228 // node_filter_map(&node_filter_map), |
229 // edge_filter_map(&edge_filter_map) { } |
229 // edge_filter_map(&edge_filter_map) { } |
312 } |
312 } |
313 |
313 |
314 |
314 |
315 }; |
315 }; |
316 |
316 |
317 /*! \brief A graph wrapper for hiding nodes and edges from a graph. |
317 /*! \brief A graph adaptor for hiding nodes and edges from a graph. |
318 |
318 |
319 \warning Graph wrappers are in even more experimental state than the other |
319 \warning Graph adaptors are in even more experimental state than the other |
320 parts of the lib. Use them at you own risk. |
320 parts of the lib. Use them at you own risk. |
321 |
321 |
322 SubGraphWrapper shows the graph with filtered node-set and |
322 SubGraphAdaptor shows the graph with filtered node-set and |
323 edge-set. |
323 edge-set. |
324 Let \f$G=(V, A)\f$ be a directed graph |
324 Let \f$G=(V, A)\f$ be a directed graph |
325 and suppose that the graph instance \c g of type ListGraph implements |
325 and suppose that the graph instance \c g of type ListGraph implements |
326 \f$G\f$. |
326 \f$G\f$. |
327 Let moreover \f$b_V\f$ and |
327 Let moreover \f$b_V\f$ and |
328 \f$b_A\f$ be bool-valued functions resp. on the node-set and edge-set. |
328 \f$b_A\f$ be bool-valued functions resp. on the node-set and edge-set. |
329 SubGraphWrapper<...>::NodeIt iterates |
329 SubGraphAdaptor<...>::NodeIt iterates |
330 on the node-set \f$\{v\in V : b_V(v)=true\}\f$ and |
330 on the node-set \f$\{v\in V : b_V(v)=true\}\f$ and |
331 SubGraphWrapper<...>::EdgeIt iterates |
331 SubGraphAdaptor<...>::EdgeIt iterates |
332 on the edge-set \f$\{e\in A : b_A(e)=true\}\f$. Similarly, |
332 on the edge-set \f$\{e\in A : b_A(e)=true\}\f$. Similarly, |
333 SubGraphWrapper<...>::OutEdgeIt and SubGraphWrapper<...>::InEdgeIt iterates |
333 SubGraphAdaptor<...>::OutEdgeIt and SubGraphAdaptor<...>::InEdgeIt iterates |
334 only on edges leaving and entering a specific node which have true value. |
334 only on edges leaving and entering a specific node which have true value. |
335 |
335 |
336 We have to note that this does not mean that an |
336 We have to note that this does not mean that an |
337 induced subgraph is obtained, the node-iterator cares only the filter |
337 induced subgraph is obtained, the node-iterator cares only the filter |
338 on the node-set, and the edge-iterators care only the filter on the |
338 on the node-set, and the edge-iterators care only the filter on the |
363 1 |
363 1 |
364 \endcode |
364 \endcode |
365 Note that \c n is of type \c SubGW::NodeIt, but it can be converted to |
365 Note that \c n is of type \c SubGW::NodeIt, but it can be converted to |
366 \c Graph::Node that is why \c g.id(n) can be applied. |
366 \c Graph::Node that is why \c g.id(n) can be applied. |
367 |
367 |
368 For other examples see also the documentation of NodeSubGraphWrapper and |
368 For other examples see also the documentation of NodeSubGraphAdaptor and |
369 EdgeSubGraphWrapper. |
369 EdgeSubGraphAdaptor. |
370 |
370 |
371 \author Marton Makai |
371 \author Marton Makai |
372 */ |
372 */ |
373 template<typename _Graph, typename NodeFilterMap, |
373 template<typename _Graph, typename NodeFilterMap, |
374 typename EdgeFilterMap> |
374 typename EdgeFilterMap> |
375 class SubGraphWrapper : |
375 class SubGraphAdaptor : |
376 public IterableGraphExtender< |
376 public IterableGraphExtender< |
377 SubGraphWrapperBase<_Graph, NodeFilterMap, EdgeFilterMap> > { |
377 SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > { |
378 public: |
378 public: |
379 typedef _Graph Graph; |
379 typedef _Graph Graph; |
380 typedef IterableGraphExtender< |
380 typedef IterableGraphExtender< |
381 SubGraphWrapperBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent; |
381 SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent; |
382 protected: |
382 protected: |
383 SubGraphWrapper() { } |
383 SubGraphAdaptor() { } |
384 public: |
384 public: |
385 SubGraphWrapper(_Graph& _graph, NodeFilterMap& _node_filter_map, |
385 SubGraphAdaptor(_Graph& _graph, NodeFilterMap& _node_filter_map, |
386 EdgeFilterMap& _edge_filter_map) { |
386 EdgeFilterMap& _edge_filter_map) { |
387 setGraph(_graph); |
387 setGraph(_graph); |
388 setNodeFilterMap(_node_filter_map); |
388 setNodeFilterMap(_node_filter_map); |
389 setEdgeFilterMap(_edge_filter_map); |
389 setEdgeFilterMap(_edge_filter_map); |
390 } |
390 } |
391 }; |
391 }; |
392 |
392 |
393 |
393 |
394 |
394 |
395 /*! \brief A wrapper for hiding nodes from a graph. |
395 /*! \brief An adaptor for hiding nodes from a graph. |
396 |
396 |
397 \warning Graph wrappers are in even more experimental state than the other |
397 \warning Graph adaptors are in even more experimental state than the other |
398 parts of the lib. Use them at you own risk. |
398 parts of the lib. Use them at you own risk. |
399 |
399 |
400 A wrapper for hiding nodes from a graph. |
400 An adaptor for hiding nodes from a graph. |
401 This wrapper specializes SubGraphWrapper in the way that only the node-set |
401 This adaptor specializes SubGraphAdaptor in the way that only the node-set |
402 can be filtered. Note that this does not mean of considering induced |
402 can be filtered. Note that this does not mean of considering induced |
403 subgraph, the edge-iterators consider the original edge-set. |
403 subgraph, the edge-iterators consider the original edge-set. |
404 \author Marton Makai |
404 \author Marton Makai |
405 */ |
405 */ |
406 template<typename Graph, typename NodeFilterMap> |
406 template<typename Graph, typename NodeFilterMap> |
407 class NodeSubGraphWrapper : |
407 class NodeSubGraphAdaptor : |
408 public SubGraphWrapper<Graph, NodeFilterMap, |
408 public SubGraphAdaptor<Graph, NodeFilterMap, |
409 ConstMap<typename Graph::Edge,bool> > { |
409 ConstMap<typename Graph::Edge,bool> > { |
410 public: |
410 public: |
411 typedef SubGraphWrapper<Graph, NodeFilterMap, |
411 typedef SubGraphAdaptor<Graph, NodeFilterMap, |
412 ConstMap<typename Graph::Edge,bool> > Parent; |
412 ConstMap<typename Graph::Edge,bool> > Parent; |
413 protected: |
413 protected: |
414 ConstMap<typename Graph::Edge, bool> const_true_map; |
414 ConstMap<typename Graph::Edge, bool> const_true_map; |
415 public: |
415 public: |
416 NodeSubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map) : |
416 NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& _node_filter_map) : |
417 Parent(), const_true_map(true) { |
417 Parent(), const_true_map(true) { |
418 Parent::setGraph(_graph); |
418 Parent::setGraph(_graph); |
419 Parent::setNodeFilterMap(_node_filter_map); |
419 Parent::setNodeFilterMap(_node_filter_map); |
420 Parent::setEdgeFilterMap(const_true_map); |
420 Parent::setEdgeFilterMap(const_true_map); |
421 } |
421 } |
422 }; |
422 }; |
423 |
423 |
424 |
424 |
425 /*! \brief A wrapper for hiding edges from a graph. |
425 /*! \brief An adaptor for hiding edges from a graph. |
426 |
426 |
427 \warning Graph wrappers are in even more experimental state than the other |
427 \warning Graph adaptors are in even more experimental state than the other |
428 parts of the lib. Use them at you own risk. |
428 parts of the lib. Use them at you own risk. |
429 |
429 |
430 A wrapper for hiding edges from a graph. |
430 An adaptor for hiding edges from a graph. |
431 This wrapper specializes SubGraphWrapper in the way that only the edge-set |
431 This adaptor specializes SubGraphAdaptor in the way that only the edge-set |
432 can be filtered. The usefulness of this wrapper is demonstrated in the |
432 can be filtered. The usefulness of this adaptor is demonstrated in the |
433 problem of searching a maximum number of edge-disjoint shortest paths |
433 problem of searching a maximum number of edge-disjoint shortest paths |
434 between |
434 between |
435 two nodes \c s and \c t. Shortest here means being shortest w.r.t. |
435 two nodes \c s and \c t. Shortest here means being shortest w.r.t. |
436 non-negative edge-lengths. Note that |
436 non-negative edge-lengths. Note that |
437 the comprehension of the presented solution |
437 the comprehension of the presented solution |
547 \endcode |
547 \endcode |
548 |
548 |
549 \author Marton Makai |
549 \author Marton Makai |
550 */ |
550 */ |
551 template<typename Graph, typename EdgeFilterMap> |
551 template<typename Graph, typename EdgeFilterMap> |
552 class EdgeSubGraphWrapper : |
552 class EdgeSubGraphAdaptor : |
553 public SubGraphWrapper<Graph, ConstMap<typename Graph::Node,bool>, |
553 public SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, |
554 EdgeFilterMap> { |
554 EdgeFilterMap> { |
555 public: |
555 public: |
556 typedef SubGraphWrapper<Graph, ConstMap<typename Graph::Node,bool>, |
556 typedef SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, |
557 EdgeFilterMap> Parent; |
557 EdgeFilterMap> Parent; |
558 protected: |
558 protected: |
559 ConstMap<typename Graph::Node, bool> const_true_map; |
559 ConstMap<typename Graph::Node, bool> const_true_map; |
560 public: |
560 public: |
561 EdgeSubGraphWrapper(Graph& _graph, EdgeFilterMap& _edge_filter_map) : |
561 EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& _edge_filter_map) : |
562 Parent(), const_true_map(true) { |
562 Parent(), const_true_map(true) { |
563 Parent::setGraph(_graph); |
563 Parent::setGraph(_graph); |
564 Parent::setNodeFilterMap(const_true_map); |
564 Parent::setNodeFilterMap(const_true_map); |
565 Parent::setEdgeFilterMap(_edge_filter_map); |
565 Parent::setEdgeFilterMap(_edge_filter_map); |
566 } |
566 } |
567 }; |
567 }; |
568 |
568 |
569 template <typename _Graph> |
569 template <typename _Graph> |
570 class UndirGraphWrapperBase : |
570 class UndirGraphAdaptorBase : |
571 public UndirGraphExtender<GraphWrapperBase<_Graph> > { |
571 public UndirGraphExtender<GraphAdaptorBase<_Graph> > { |
572 public: |
572 public: |
573 typedef _Graph Graph; |
573 typedef _Graph Graph; |
574 typedef UndirGraphExtender<GraphWrapperBase<_Graph> > Parent; |
574 typedef UndirGraphExtender<GraphAdaptorBase<_Graph> > Parent; |
575 protected: |
575 protected: |
576 UndirGraphWrapperBase() : Parent() { } |
576 UndirGraphAdaptorBase() : Parent() { } |
577 public: |
577 public: |
578 typedef typename Parent::UndirEdge UndirEdge; |
578 typedef typename Parent::UndirEdge UndirEdge; |
579 typedef typename Parent::Edge Edge; |
579 typedef typename Parent::Edge Edge; |
580 |
580 |
581 /// \bug Why cant an edge say that it is forward or not??? |
581 /// \bug Why cant an edge say that it is forward or not??? |
582 /// By this, a pointer to the graph have to be stored |
582 /// By this, a pointer to the graph have to be stored |
583 /// The implementation |
583 /// The implementation |
584 template <typename T> |
584 template <typename T> |
585 class EdgeMap { |
585 class EdgeMap { |
586 protected: |
586 protected: |
587 const UndirGraphWrapperBase<_Graph>* g; |
587 const UndirGraphAdaptorBase<_Graph>* g; |
588 template <typename TT> friend class EdgeMap; |
588 template <typename TT> friend class EdgeMap; |
589 typename _Graph::template EdgeMap<T> forward_map, backward_map; |
589 typename _Graph::template EdgeMap<T> forward_map, backward_map; |
590 public: |
590 public: |
591 typedef T Value; |
591 typedef T Value; |
592 typedef Edge Key; |
592 typedef Edge Key; |
593 |
593 |
594 EdgeMap(const UndirGraphWrapperBase<_Graph>& _g) : g(&_g), |
594 EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g) : g(&_g), |
595 forward_map(*(g->graph)), backward_map(*(g->graph)) { } |
595 forward_map(*(g->graph)), backward_map(*(g->graph)) { } |
596 |
596 |
597 EdgeMap(const UndirGraphWrapperBase<_Graph>& _g, T a) : g(&_g), |
597 EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g, T a) : g(&_g), |
598 forward_map(*(g->graph), a), backward_map(*(g->graph), a) { } |
598 forward_map(*(g->graph), a), backward_map(*(g->graph), a) { } |
599 |
599 |
600 void set(Edge e, T a) { |
600 void set(Edge e, T a) { |
601 if (g->forward(e)) |
601 if (g->forward(e)) |
602 forward_map.set(e, a); |
602 forward_map.set(e, a); |
635 } |
635 } |
636 }; |
636 }; |
637 |
637 |
638 }; |
638 }; |
639 |
639 |
640 /// \brief An undirected graph is made from a directed graph by a wrapper |
640 /// \brief An undirected graph is made from a directed graph by an adaptor |
641 /// |
641 /// |
642 /// Undocumented, untested!!! |
642 /// Undocumented, untested!!! |
643 /// If somebody knows nice demo application, let's polulate it. |
643 /// If somebody knows nice demo application, let's polulate it. |
644 /// |
644 /// |
645 /// \author Marton Makai |
645 /// \author Marton Makai |
646 template<typename _Graph> |
646 template<typename _Graph> |
647 class UndirGraphWrapper : |
647 class UndirGraphAdaptor : |
648 public IterableUndirGraphExtender< |
648 public IterableUndirGraphExtender< |
649 UndirGraphWrapperBase<_Graph> > { |
649 UndirGraphAdaptorBase<_Graph> > { |
650 public: |
650 public: |
651 typedef _Graph Graph; |
651 typedef _Graph Graph; |
652 typedef IterableUndirGraphExtender< |
652 typedef IterableUndirGraphExtender< |
653 UndirGraphWrapperBase<_Graph> > Parent; |
653 UndirGraphAdaptorBase<_Graph> > Parent; |
654 protected: |
654 protected: |
655 UndirGraphWrapper() { } |
655 UndirGraphAdaptor() { } |
656 public: |
656 public: |
657 UndirGraphWrapper(_Graph& _graph) { |
657 UndirGraphAdaptor(_Graph& _graph) { |
658 setGraph(_graph); |
658 setGraph(_graph); |
659 } |
659 } |
660 }; |
660 }; |
661 |
661 |
662 |
662 |
663 template <typename _Graph, |
663 template <typename _Graph, |
664 typename ForwardFilterMap, typename BackwardFilterMap> |
664 typename ForwardFilterMap, typename BackwardFilterMap> |
665 class SubBidirGraphWrapperBase : public GraphWrapperBase<_Graph> { |
665 class SubBidirGraphAdaptorBase : public GraphAdaptorBase<_Graph> { |
666 public: |
666 public: |
667 typedef _Graph Graph; |
667 typedef _Graph Graph; |
668 typedef GraphWrapperBase<_Graph> Parent; |
668 typedef GraphAdaptorBase<_Graph> Parent; |
669 protected: |
669 protected: |
670 ForwardFilterMap* forward_filter; |
670 ForwardFilterMap* forward_filter; |
671 BackwardFilterMap* backward_filter; |
671 BackwardFilterMap* backward_filter; |
672 SubBidirGraphWrapperBase() : Parent(), |
672 SubBidirGraphAdaptorBase() : Parent(), |
673 forward_filter(0), backward_filter(0) { } |
673 forward_filter(0), backward_filter(0) { } |
674 |
674 |
675 void setForwardFilterMap(ForwardFilterMap& _forward_filter) { |
675 void setForwardFilterMap(ForwardFilterMap& _forward_filter) { |
676 forward_filter=&_forward_filter; |
676 forward_filter=&_forward_filter; |
677 } |
677 } |
678 void setBackwardFilterMap(BackwardFilterMap& _backward_filter) { |
678 void setBackwardFilterMap(BackwardFilterMap& _backward_filter) { |
679 backward_filter=&_backward_filter; |
679 backward_filter=&_backward_filter; |
680 } |
680 } |
681 |
681 |
682 public: |
682 public: |
683 // SubGraphWrapperBase(Graph& _graph, |
683 // SubGraphAdaptorBase(Graph& _graph, |
684 // NodeFilterMap& _node_filter_map, |
684 // NodeFilterMap& _node_filter_map, |
685 // EdgeFilterMap& _edge_filter_map) : |
685 // EdgeFilterMap& _edge_filter_map) : |
686 // Parent(&_graph), |
686 // Parent(&_graph), |
687 // node_filter_map(&node_filter_map), |
687 // node_filter_map(&node_filter_map), |
688 // edge_filter_map(&edge_filter_map) { } |
688 // edge_filter_map(&edge_filter_map) { } |
689 |
689 |
690 typedef typename Parent::Node Node; |
690 typedef typename Parent::Node Node; |
691 typedef typename _Graph::Edge GraphEdge; |
691 typedef typename _Graph::Edge GraphEdge; |
692 template <typename T> class EdgeMap; |
692 template <typename T> class EdgeMap; |
693 /// SubBidirGraphWrapperBase<..., ..., ...>::Edge is inherited from |
693 /// SubBidirGraphAdaptorBase<..., ..., ...>::Edge is inherited from |
694 /// _Graph::Edge. It contains an extra bool flag which is true |
694 /// _Graph::Edge. It contains an extra bool flag which is true |
695 /// if and only if the |
695 /// if and only if the |
696 /// edge is the backward version of the original edge. |
696 /// edge is the backward version of the original edge. |
697 class Edge : public _Graph::Edge { |
697 class Edge : public _Graph::Edge { |
698 friend class SubBidirGraphWrapperBase< |
698 friend class SubBidirGraphAdaptorBase< |
699 Graph, ForwardFilterMap, BackwardFilterMap>; |
699 Graph, ForwardFilterMap, BackwardFilterMap>; |
700 template<typename T> friend class EdgeMap; |
700 template<typename T> friend class EdgeMap; |
701 protected: |
701 protected: |
702 bool backward; //true, iff backward |
702 bool backward; //true, iff backward |
703 public: |
703 public: |
847 |
847 |
848 bool forward(const Edge& e) const { return !e.backward; } |
848 bool forward(const Edge& e) const { return !e.backward; } |
849 bool backward(const Edge& e) const { return e.backward; } |
849 bool backward(const Edge& e) const { return e.backward; } |
850 |
850 |
851 template <typename T> |
851 template <typename T> |
852 /// \c SubBidirGraphWrapperBase<..., ..., ...>::EdgeMap contains two |
852 /// \c SubBidirGraphAdaptorBase<..., ..., ...>::EdgeMap contains two |
853 /// _Graph::EdgeMap one for the forward edges and |
853 /// _Graph::EdgeMap one for the forward edges and |
854 /// one for the backward edges. |
854 /// one for the backward edges. |
855 class EdgeMap { |
855 class EdgeMap { |
856 template <typename TT> friend class EdgeMap; |
856 template <typename TT> friend class EdgeMap; |
857 typename _Graph::template EdgeMap<T> forward_map, backward_map; |
857 typename _Graph::template EdgeMap<T> forward_map, backward_map; |
858 public: |
858 public: |
859 typedef T Value; |
859 typedef T Value; |
860 typedef Edge Key; |
860 typedef Edge Key; |
861 |
861 |
862 EdgeMap(const SubBidirGraphWrapperBase<_Graph, |
862 EdgeMap(const SubBidirGraphAdaptorBase<_Graph, |
863 ForwardFilterMap, BackwardFilterMap>& g) : |
863 ForwardFilterMap, BackwardFilterMap>& g) : |
864 forward_map(*(g.graph)), backward_map(*(g.graph)) { } |
864 forward_map(*(g.graph)), backward_map(*(g.graph)) { } |
865 |
865 |
866 EdgeMap(const SubBidirGraphWrapperBase<_Graph, |
866 EdgeMap(const SubBidirGraphAdaptorBase<_Graph, |
867 ForwardFilterMap, BackwardFilterMap>& g, T a) : |
867 ForwardFilterMap, BackwardFilterMap>& g, T a) : |
868 forward_map(*(g.graph), a), backward_map(*(g.graph), a) { } |
868 forward_map(*(g.graph), a), backward_map(*(g.graph), a) { } |
869 |
869 |
870 void set(Edge e, T a) { |
870 void set(Edge e, T a) { |
871 if (!e.backward) |
871 if (!e.backward) |
897 }; |
897 }; |
898 |
898 |
899 }; |
899 }; |
900 |
900 |
901 |
901 |
902 ///\brief A wrapper for composing a subgraph of a |
902 ///\brief An adaptor for composing a subgraph of a |
903 /// bidirected graph made from a directed one. |
903 /// bidirected graph made from a directed one. |
904 /// |
904 /// |
905 /// A wrapper for composing a subgraph of a |
905 /// An adaptor for composing a subgraph of a |
906 /// bidirected graph made from a directed one. |
906 /// bidirected graph made from a directed one. |
907 /// |
907 /// |
908 ///\warning Graph wrappers are in even more experimental state than the other |
908 ///\warning Graph adaptors are in even more experimental state than the other |
909 ///parts of the lib. Use them at you own risk. |
909 ///parts of the lib. Use them at you own risk. |
910 /// |
910 /// |
911 /// Let \f$G=(V, A)\f$ be a directed graph and for each directed edge |
911 /// Let \f$G=(V, A)\f$ be a directed graph and for each directed edge |
912 /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by |
912 /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by |
913 /// reversing its orientation. We are given moreover two bool valued |
913 /// reversing its orientation. We are given moreover two bool valued |
914 /// maps on the edge-set, |
914 /// maps on the edge-set, |
915 /// \f$forward\_filter\f$, and \f$backward\_filter\f$. |
915 /// \f$forward\_filter\f$, and \f$backward\_filter\f$. |
916 /// SubBidirGraphWrapper implements the graph structure with node-set |
916 /// SubBidirGraphAdaptor implements the graph structure with node-set |
917 /// \f$V\f$ and edge-set |
917 /// \f$V\f$ and edge-set |
918 /// \f$\{e : e\in A \mbox{ and } forward\_filter(e) \mbox{ is true}\}+\{\bar e : e\in A \mbox{ and } backward\_filter(e) \mbox{ is true}\}\f$. |
918 /// \f$\{e : e\in A \mbox{ and } forward\_filter(e) \mbox{ is true}\}+\{\bar e : e\in A \mbox{ and } backward\_filter(e) \mbox{ is true}\}\f$. |
919 /// The purpose of writing + instead of union is because parallel |
919 /// The purpose of writing + instead of union is because parallel |
920 /// edges can arise. (Similarly, antiparallel edges also can arise). |
920 /// edges can arise. (Similarly, antiparallel edges also can arise). |
921 /// In other words, a subgraph of the bidirected graph obtained, which |
921 /// In other words, a subgraph of the bidirected graph obtained, which |
922 /// is given by orienting the edges of the original graph in both directions. |
922 /// is given by orienting the edges of the original graph in both directions. |
923 /// As the oppositely directed edges are logically different, |
923 /// As the oppositely directed edges are logically different, |
924 /// the maps are able to attach different values for them. |
924 /// the maps are able to attach different values for them. |
925 /// |
925 /// |
926 /// An example for such a construction is \c RevGraphWrapper where the |
926 /// An example for such a construction is \c RevGraphAdaptor where the |
927 /// forward_filter is everywhere false and the backward_filter is |
927 /// forward_filter is everywhere false and the backward_filter is |
928 /// everywhere true. We note that for sake of efficiency, |
928 /// everywhere true. We note that for sake of efficiency, |
929 /// \c RevGraphWrapper is implemented in a different way. |
929 /// \c RevGraphAdaptor is implemented in a different way. |
930 /// But BidirGraphWrapper is obtained from |
930 /// But BidirGraphAdaptor is obtained from |
931 /// SubBidirGraphWrapper by considering everywhere true |
931 /// SubBidirGraphAdaptor by considering everywhere true |
932 /// valued maps both for forward_filter and backward_filter. |
932 /// valued maps both for forward_filter and backward_filter. |
933 /// |
933 /// |
934 /// The most important application of SubBidirGraphWrapper |
934 /// The most important application of SubBidirGraphAdaptor |
935 /// is ResGraphWrapper, which stands for the residual graph in directed |
935 /// is ResGraphAdaptor, which stands for the residual graph in directed |
936 /// flow and circulation problems. |
936 /// flow and circulation problems. |
937 /// As wrappers usually, the SubBidirGraphWrapper implements the |
937 /// As adaptors usually, the SubBidirGraphAdaptor implements the |
938 /// above mentioned graph structure without its physical storage, |
938 /// above mentioned graph structure without its physical storage, |
939 /// that is the whole stuff is stored in constant memory. |
939 /// that is the whole stuff is stored in constant memory. |
940 template<typename _Graph, |
940 template<typename _Graph, |
941 typename ForwardFilterMap, typename BackwardFilterMap> |
941 typename ForwardFilterMap, typename BackwardFilterMap> |
942 class SubBidirGraphWrapper : |
942 class SubBidirGraphAdaptor : |
943 public IterableGraphExtender< |
943 public IterableGraphExtender< |
944 SubBidirGraphWrapperBase<_Graph, ForwardFilterMap, BackwardFilterMap> > { |
944 SubBidirGraphAdaptorBase<_Graph, ForwardFilterMap, BackwardFilterMap> > { |
945 public: |
945 public: |
946 typedef _Graph Graph; |
946 typedef _Graph Graph; |
947 typedef IterableGraphExtender< |
947 typedef IterableGraphExtender< |
948 SubBidirGraphWrapperBase< |
948 SubBidirGraphAdaptorBase< |
949 _Graph, ForwardFilterMap, BackwardFilterMap> > Parent; |
949 _Graph, ForwardFilterMap, BackwardFilterMap> > Parent; |
950 protected: |
950 protected: |
951 SubBidirGraphWrapper() { } |
951 SubBidirGraphAdaptor() { } |
952 public: |
952 public: |
953 SubBidirGraphWrapper(_Graph& _graph, ForwardFilterMap& _forward_filter, |
953 SubBidirGraphAdaptor(_Graph& _graph, ForwardFilterMap& _forward_filter, |
954 BackwardFilterMap& _backward_filter) { |
954 BackwardFilterMap& _backward_filter) { |
955 setGraph(_graph); |
955 setGraph(_graph); |
956 setForwardFilterMap(_forward_filter); |
956 setForwardFilterMap(_forward_filter); |
957 setBackwardFilterMap(_backward_filter); |
957 setBackwardFilterMap(_backward_filter); |
958 } |
958 } |
959 }; |
959 }; |
960 |
960 |
961 |
961 |
962 |
962 |
963 ///\brief A wrapper for composing bidirected graph from a directed one. |
963 ///\brief An adaptor for composing bidirected graph from a directed one. |
964 /// |
964 /// |
965 ///\warning Graph wrappers are in even more experimental state than the other |
965 ///\warning Graph adaptors are in even more experimental state than the other |
966 ///parts of the lib. Use them at you own risk. |
966 ///parts of the lib. Use them at you own risk. |
967 /// |
967 /// |
968 /// A wrapper for composing bidirected graph from a directed one. |
968 /// An adaptor for composing bidirected graph from a directed one. |
969 /// A bidirected graph is composed over the directed one without physical |
969 /// A bidirected graph is composed over the directed one without physical |
970 /// storage. As the oppositely directed edges are logically different ones |
970 /// storage. As the oppositely directed edges are logically different ones |
971 /// the maps are able to attach different values for them. |
971 /// the maps are able to attach different values for them. |
972 template<typename Graph> |
972 template<typename Graph> |
973 class BidirGraphWrapper : |
973 class BidirGraphAdaptor : |
974 public SubBidirGraphWrapper< |
974 public SubBidirGraphAdaptor< |
975 Graph, |
975 Graph, |
976 ConstMap<typename Graph::Edge, bool>, |
976 ConstMap<typename Graph::Edge, bool>, |
977 ConstMap<typename Graph::Edge, bool> > { |
977 ConstMap<typename Graph::Edge, bool> > { |
978 public: |
978 public: |
979 typedef SubBidirGraphWrapper< |
979 typedef SubBidirGraphAdaptor< |
980 Graph, |
980 Graph, |
981 ConstMap<typename Graph::Edge, bool>, |
981 ConstMap<typename Graph::Edge, bool>, |
982 ConstMap<typename Graph::Edge, bool> > Parent; |
982 ConstMap<typename Graph::Edge, bool> > Parent; |
983 protected: |
983 protected: |
984 ConstMap<typename Graph::Edge, bool> cm; |
984 ConstMap<typename Graph::Edge, bool> cm; |
985 |
985 |
986 BidirGraphWrapper() : Parent(), cm(true) { |
986 BidirGraphAdaptor() : Parent(), cm(true) { |
987 Parent::setForwardFilterMap(cm); |
987 Parent::setForwardFilterMap(cm); |
988 Parent::setBackwardFilterMap(cm); |
988 Parent::setBackwardFilterMap(cm); |
989 } |
989 } |
990 public: |
990 public: |
991 BidirGraphWrapper(Graph& _graph) : Parent(), cm(true) { |
991 BidirGraphAdaptor(Graph& _graph) : Parent(), cm(true) { |
992 Parent::setGraph(_graph); |
992 Parent::setGraph(_graph); |
993 Parent::setForwardFilterMap(cm); |
993 Parent::setForwardFilterMap(cm); |
994 Parent::setBackwardFilterMap(cm); |
994 Parent::setBackwardFilterMap(cm); |
995 } |
995 } |
996 |
996 |
997 int edgeNum() const { |
997 int edgeNum() const { |
998 return 2*this->graph->edgeNum(); |
998 return 2*this->graph->edgeNum(); |
999 } |
999 } |
1000 // KEEP_MAPS(Parent, BidirGraphWrapper); |
1000 // KEEP_MAPS(Parent, BidirGraphAdaptor); |
1001 }; |
1001 }; |
1002 |
1002 |
1003 |
1003 |
1004 template<typename Graph, typename Number, |
1004 template<typename Graph, typename Number, |
1005 typename CapacityMap, typename FlowMap> |
1005 typename CapacityMap, typename FlowMap> |
1035 return (Number(0) < Number((*flow)[e])); |
1035 return (Number(0) < Number((*flow)[e])); |
1036 } |
1036 } |
1037 }; |
1037 }; |
1038 |
1038 |
1039 |
1039 |
1040 /*! \brief A wrapper for composing the residual graph for directed flow and circulation problems. |
1040 /*! \brief An adaptor for composing the residual graph for directed flow and circulation problems. |
1041 |
1041 |
1042 A wrapper for composing the residual graph for directed flow and circulation problems. |
1042 An adaptor for composing the residual graph for directed flow and circulation problems. |
1043 Let \f$G=(V, A)\f$ be a directed graph and let \f$F\f$ be a |
1043 Let \f$G=(V, A)\f$ be a directed graph and let \f$F\f$ be a |
1044 number type. Let moreover |
1044 number type. Let moreover |
1045 \f$f,c:A\to F\f$, be functions on the edge-set. |
1045 \f$f,c:A\to F\f$, be functions on the edge-set. |
1046 In the appications of ResGraphWrapper, \f$f\f$ usually stands for a flow |
1046 In the appications of ResGraphAdaptor, \f$f\f$ usually stands for a flow |
1047 and \f$c\f$ for a capacity function. |
1047 and \f$c\f$ for a capacity function. |
1048 Suppose that a graph instange \c g of type |
1048 Suppose that a graph instange \c g of type |
1049 \c ListGraph implements \f$G\f$. |
1049 \c ListGraph implements \f$G\f$. |
1050 \code |
1050 \code |
1051 ListGraph g; |
1051 ListGraph g; |
1052 \endcode |
1052 \endcode |
1053 Then RevGraphWrapper implements the graph structure with node-set |
1053 Then RevGraphAdaptor implements the graph structure with node-set |
1054 \f$V\f$ and edge-set \f$A_{forward}\cup A_{backward}\f$, where |
1054 \f$V\f$ and edge-set \f$A_{forward}\cup A_{backward}\f$, where |
1055 \f$A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\}\f$ and |
1055 \f$A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\}\f$ and |
1056 \f$A_{backward}=\{vu : uv\in A, f(uv)>0\}\f$, |
1056 \f$A_{backward}=\{vu : uv\in A, f(uv)>0\}\f$, |
1057 i.e. the so called residual graph. |
1057 i.e. the so called residual graph. |
1058 When we take the union \f$A_{forward}\cup A_{backward}\f$, |
1058 When we take the union \f$A_{forward}\cup A_{backward}\f$, |
1059 multilicities are counted, i.e. if an edge is in both |
1059 multilicities are counted, i.e. if an edge is in both |
1060 \f$A_{forward}\f$ and \f$A_{backward}\f$, then in the wrapper it |
1060 \f$A_{forward}\f$ and \f$A_{backward}\f$, then in the adaptor it |
1061 appears twice. |
1061 appears twice. |
1062 The following code shows how |
1062 The following code shows how |
1063 such an instance can be constructed. |
1063 such an instance can be constructed. |
1064 \code |
1064 \code |
1065 typedef ListGraph Graph; |
1065 typedef ListGraph Graph; |
1066 Graph::EdgeMap<int> f(g); |
1066 Graph::EdgeMap<int> f(g); |
1067 Graph::EdgeMap<int> c(g); |
1067 Graph::EdgeMap<int> c(g); |
1068 ResGraphWrapper<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > gw(g); |
1068 ResGraphAdaptor<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > gw(g); |
1069 \endcode |
1069 \endcode |
1070 \author Marton Makai |
1070 \author Marton Makai |
1071 */ |
1071 */ |
1072 template<typename Graph, typename Number, |
1072 template<typename Graph, typename Number, |
1073 typename CapacityMap, typename FlowMap> |
1073 typename CapacityMap, typename FlowMap> |
1074 class ResGraphWrapper : |
1074 class ResGraphAdaptor : |
1075 public SubBidirGraphWrapper< |
1075 public SubBidirGraphAdaptor< |
1076 Graph, |
1076 Graph, |
1077 ResForwardFilter<Graph, Number, CapacityMap, FlowMap>, |
1077 ResForwardFilter<Graph, Number, CapacityMap, FlowMap>, |
1078 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > { |
1078 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > { |
1079 public: |
1079 public: |
1080 typedef SubBidirGraphWrapper< |
1080 typedef SubBidirGraphAdaptor< |
1081 Graph, |
1081 Graph, |
1082 ResForwardFilter<Graph, Number, CapacityMap, FlowMap>, |
1082 ResForwardFilter<Graph, Number, CapacityMap, FlowMap>, |
1083 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent; |
1083 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent; |
1084 protected: |
1084 protected: |
1085 const CapacityMap* capacity; |
1085 const CapacityMap* capacity; |
1086 FlowMap* flow; |
1086 FlowMap* flow; |
1087 ResForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter; |
1087 ResForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter; |
1088 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter; |
1088 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter; |
1089 ResGraphWrapper() : Parent(), |
1089 ResGraphAdaptor() : Parent(), |
1090 capacity(0), flow(0) { } |
1090 capacity(0), flow(0) { } |
1091 void setCapacityMap(const CapacityMap& _capacity) { |
1091 void setCapacityMap(const CapacityMap& _capacity) { |
1092 capacity=&_capacity; |
1092 capacity=&_capacity; |
1093 forward_filter.setCapacity(_capacity); |
1093 forward_filter.setCapacity(_capacity); |
1094 backward_filter.setCapacity(_capacity); |
1094 backward_filter.setCapacity(_capacity); |
1122 /// |
1122 /// |
1123 /// In generic residual graphs the residual capacity can be obtained |
1123 /// In generic residual graphs the residual capacity can be obtained |
1124 /// as a map. |
1124 /// as a map. |
1125 class ResCap { |
1125 class ResCap { |
1126 protected: |
1126 protected: |
1127 const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>* res_graph; |
1127 const ResGraphAdaptor<Graph, Number, CapacityMap, FlowMap>* res_graph; |
1128 public: |
1128 public: |
1129 typedef Number Value; |
1129 typedef Number Value; |
1130 typedef Edge Key; |
1130 typedef Edge Key; |
1131 ResCap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& |
1131 ResCap(const ResGraphAdaptor<Graph, Number, CapacityMap, FlowMap>& |
1132 _res_graph) : res_graph(&_res_graph) { } |
1132 _res_graph) : res_graph(&_res_graph) { } |
1133 Number operator[](const Edge& e) const { |
1133 Number operator[](const Edge& e) const { |
1134 if (res_graph->forward(e)) |
1134 if (res_graph->forward(e)) |
1135 return (*(res_graph->capacity))[e]-(*(res_graph->flow))[e]; |
1135 return (*(res_graph->capacity))[e]-(*(res_graph->flow))[e]; |
1136 else |
1136 else |
1137 return (*(res_graph->flow))[e]; |
1137 return (*(res_graph->flow))[e]; |
1138 } |
1138 } |
1139 }; |
1139 }; |
1140 |
1140 |
1141 // KEEP_MAPS(Parent, ResGraphWrapper); |
1141 // KEEP_MAPS(Parent, ResGraphAdaptor); |
1142 }; |
1142 }; |
1143 |
1143 |
1144 |
1144 |
1145 |
1145 |
1146 template <typename _Graph, typename FirstOutEdgesMap> |
1146 template <typename _Graph, typename FirstOutEdgesMap> |
1147 class ErasingFirstGraphWrapperBase : public GraphWrapperBase<_Graph> { |
1147 class ErasingFirstGraphAdaptorBase : public GraphAdaptorBase<_Graph> { |
1148 public: |
1148 public: |
1149 typedef _Graph Graph; |
1149 typedef _Graph Graph; |
1150 typedef GraphWrapperBase<_Graph> Parent; |
1150 typedef GraphAdaptorBase<_Graph> Parent; |
1151 protected: |
1151 protected: |
1152 FirstOutEdgesMap* first_out_edges; |
1152 FirstOutEdgesMap* first_out_edges; |
1153 ErasingFirstGraphWrapperBase() : Parent(), |
1153 ErasingFirstGraphAdaptorBase() : Parent(), |
1154 first_out_edges(0) { } |
1154 first_out_edges(0) { } |
1155 |
1155 |
1156 void setFirstOutEdgesMap(FirstOutEdgesMap& _first_out_edges) { |
1156 void setFirstOutEdgesMap(FirstOutEdgesMap& _first_out_edges) { |
1157 first_out_edges=&_first_out_edges; |
1157 first_out_edges=&_first_out_edges; |
1158 } |
1158 } |
1175 }; |
1175 }; |
1176 |
1176 |
1177 |
1177 |
1178 /// For blocking flows. |
1178 /// For blocking flows. |
1179 |
1179 |
1180 ///\warning Graph wrappers are in even more experimental state than the other |
1180 ///\warning Graph adaptors are in even more experimental state than the other |
1181 ///parts of the lib. Use them at you own risk. |
1181 ///parts of the lib. Use them at you own risk. |
1182 /// |
1182 /// |
1183 /// This graph wrapper is used for on-the-fly |
1183 /// This graph adaptor is used for on-the-fly |
1184 /// Dinits blocking flow computations. |
1184 /// Dinits blocking flow computations. |
1185 /// For each node, an out-edge is stored which is used when the |
1185 /// For each node, an out-edge is stored which is used when the |
1186 /// \code |
1186 /// \code |
1187 /// OutEdgeIt& first(OutEdgeIt&, const Node&) |
1187 /// OutEdgeIt& first(OutEdgeIt&, const Node&) |
1188 /// \endcode |
1188 /// \endcode |
1189 /// is called. |
1189 /// is called. |
1190 /// |
1190 /// |
1191 /// \author Marton Makai |
1191 /// \author Marton Makai |
1192 template <typename _Graph, typename FirstOutEdgesMap> |
1192 template <typename _Graph, typename FirstOutEdgesMap> |
1193 class ErasingFirstGraphWrapper : |
1193 class ErasingFirstGraphAdaptor : |
1194 public IterableGraphExtender< |
1194 public IterableGraphExtender< |
1195 ErasingFirstGraphWrapperBase<_Graph, FirstOutEdgesMap> > { |
1195 ErasingFirstGraphAdaptorBase<_Graph, FirstOutEdgesMap> > { |
1196 public: |
1196 public: |
1197 typedef _Graph Graph; |
1197 typedef _Graph Graph; |
1198 typedef IterableGraphExtender< |
1198 typedef IterableGraphExtender< |
1199 ErasingFirstGraphWrapperBase<_Graph, FirstOutEdgesMap> > Parent; |
1199 ErasingFirstGraphAdaptorBase<_Graph, FirstOutEdgesMap> > Parent; |
1200 ErasingFirstGraphWrapper(Graph& _graph, |
1200 ErasingFirstGraphAdaptor(Graph& _graph, |
1201 FirstOutEdgesMap& _first_out_edges) { |
1201 FirstOutEdgesMap& _first_out_edges) { |
1202 setGraph(_graph); |
1202 setGraph(_graph); |
1203 setFirstOutEdgesMap(_first_out_edges); |
1203 setFirstOutEdgesMap(_first_out_edges); |
1204 } |
1204 } |
1205 |
1205 |