doc change - one more todo.
2 #ifndef HUGO_GRAPH_WRAPPER_H
3 #define HUGO_GRAPH_WRAPPER_H
7 ///\brief Several graph wrappers.
9 ///This file contains several useful graph wrapper functions.
11 ///\author Marton Makai
13 #include <hugo/invalid.h>
14 #include <hugo/maps.h>
15 //#include <iter_map.h>
21 /// \addtogroup gwrappers
22 /// A main parts of HUGOlib are the different graph structures,
23 /// generic graph algorithms, graph concepts which couple these, and
24 /// graph wrappers. While the previous ones are more or less clear, the
25 /// latter notion needs further explanation.
26 /// Graph wrappers are graph classes which serve for considering graph
27 /// structures in different ways. A short example makes the notion much
29 /// Suppose that we have an instance \c g of a directed graph
30 /// type say \c ListGraph and an algorithm
31 /// \code template<typename Graph> int algorithm(const Graph&); \endcode
32 /// is needed to run on the reversely oriented graph.
33 /// It may be expensive (in time or in memory usage) to copy
34 /// \c g with the reverse orientation.
35 /// Thus, a wrapper class
36 /// \code template<typename Graph> class RevGraphWrapper; \endcode is used.
37 /// The code looks as follows
40 /// RevGraphWrapper<ListGraph> rgw(g);
41 /// int result=algorithm(rgw);
43 /// After running the algorithm, the original graph \c g
44 /// remains untouched. Thus the graph wrapper used above is to consider the
45 /// original graph with reverse orientation.
46 /// This techniques gives rise to an elegant code, and
47 /// based on stable graph wrappers, complex algorithms can be
48 /// implemented easily.
49 /// In flow, circulation and bipartite matching problems, the residual
50 /// graph is of particular importance. Combining a wrapper implementing
51 /// this, shortest path algorithms and minimum mean cycle algorithms,
52 /// a range of weighted and cardinality optimization algorithms can be
53 /// obtained. For lack of space, for other examples,
54 /// the interested user is referred to the detailed documentation of graph
56 /// The behavior of graph wrappers can be very different. Some of them keep
57 /// capabilities of the original graph while in other cases this would be
58 /// meaningless. This means that the concepts that they are a model of depend
59 /// on the graph wrapper, and the wrapped graph(s).
60 /// If an edge of \c rgw is deleted, this is carried out by
61 /// deleting the corresponding edge of \c g. But for a residual
62 /// graph, this operation has no sense.
63 /// Let we stand one more example here to simplify your work.
65 /// \code template<typename Graph> class RevGraphWrapper; \endcode
67 /// <tt> RevGraphWrapper(Graph& _g)</tt>.
68 /// This means that in a situation,
69 /// when a <tt> const ListGraph& </tt> reference to a graph is given,
70 /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
72 /// int algorithm1(const ListGraph& g) {
73 /// RevGraphWrapper<const ListGraph> rgw(g);
74 /// return algorithm2(rgw);
78 /// \addtogroup gwrappers
81 ///Base type for the Graph Wrappers
83 ///This is the base type for the Graph Wrappers.
84 ///\todo Some more docs...
86 ///\author Marton Makai
87 template<typename Graph>
91 GraphWrapper() : graph(0) { }
92 void setGraph(Graph& _graph) { graph=&_graph; }
95 typedef Graph BaseGraph;
96 typedef Graph ParentGraph;
98 GraphWrapper(Graph& _graph) : graph(&_graph) { }
99 // Graph& getGraph() const { return *graph; }
101 // typedef typename Graph::Node Node;
102 class Node : public Graph::Node {
103 friend class GraphWrapper<Graph>;
106 Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
107 // /// \bug construction throughrthr multiple levels should be
108 // /// handled better
109 // Node(const typename ParentGraph::ParentGraph::Node& _n) :
110 // Graph::Node(_n) { }
111 Node(const Invalid& i) : Graph::Node(i) { }
114 friend class GraphWrapper<Graph>;
115 typename Graph::NodeIt n;
118 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
119 NodeIt(const Invalid& i) : n(i) { }
120 NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { }
121 operator Node() const { return Node(typename Graph::Node(n)); }
123 // typedef typename Graph::Edge Edge;
124 class Edge : public Graph::Edge {
125 friend class GraphWrapper<Graph>;
128 Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
129 Edge(const Invalid& i) : Graph::Edge(i) { }
132 friend class GraphWrapper<Graph>;
133 typename Graph::OutEdgeIt e;
136 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
137 OutEdgeIt(const Invalid& i) : e(i) { }
138 OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
139 e(*(_G.graph), typename Graph::Node(_n)) { }
140 operator Edge() const { return Edge(typename Graph::Edge(e)); }
143 friend class GraphWrapper<Graph>;
144 typename Graph::InEdgeIt e;
147 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
148 InEdgeIt(const Invalid& i) : e(i) { }
149 InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
150 e(*(_G.graph), typename Graph::Node(_n)) { }
151 operator Edge() const { return Edge(typename Graph::Edge(e)); }
153 //typedef typename Graph::SymEdgeIt SymEdgeIt;
155 friend class GraphWrapper<Graph>;
156 typename Graph::EdgeIt e;
159 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
160 EdgeIt(const Invalid& i) : e(i) { }
161 EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
162 operator Edge() const { return Edge(typename Graph::Edge(e)); }
165 NodeIt& first(NodeIt& i) const {
166 i=NodeIt(*this); return i;
168 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
169 i=OutEdgeIt(*this, p); return i;
171 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
172 i=InEdgeIt(*this, p); return i;
174 EdgeIt& first(EdgeIt& i) const {
175 i=EdgeIt(*this); return i;
178 NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
179 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
180 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
181 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
183 Node tail(const Edge& e) const {
184 return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
185 Node head(const Edge& e) const {
186 return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
188 bool valid(const Node& n) const {
189 return graph->valid(static_cast<typename Graph::Node>(n)); }
190 bool valid(const Edge& e) const {
191 return graph->valid(static_cast<typename Graph::Edge>(e)); }
193 int nodeNum() const { return graph->nodeNum(); }
194 int edgeNum() const { return graph->edgeNum(); }
196 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
197 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
198 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
199 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
201 Node addNode() const { return Node(graph->addNode()); }
202 Edge addEdge(const Node& tail, const Node& head) const {
203 return Edge(graph->addEdge(tail, head)); }
205 void erase(const Node& i) const { graph->erase(i); }
206 void erase(const Edge& i) const { graph->erase(i); }
208 void clear() const { graph->clear(); }
210 bool forward(const Edge& e) const { return graph->forward(e); }
211 bool backward(const Edge& e) const { return graph->backward(e); }
213 int id(const Node& v) const { return graph->id(v); }
214 int id(const Edge& e) const { return graph->id(e); }
216 Edge opposite(const Edge& e) const { return Edge(graph->opposite(e)); }
218 template<typename T> class NodeMap : public Graph::template NodeMap<T> {
219 typedef typename Graph::template NodeMap<T> Parent;
221 NodeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
222 NodeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
225 template<typename T> class EdgeMap : public Graph::template EdgeMap<T> {
226 typedef typename Graph::template EdgeMap<T> Parent;
228 EdgeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
229 EdgeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
235 /// A graph wrapper which reverses the orientation of the edges.
237 /// A graph wrapper which reverses the orientation of the edges.
238 /// Thus \c Graph have to be a directed graph type.
240 ///\author Marton Makai
241 template<typename Graph>
242 class RevGraphWrapper : public GraphWrapper<Graph> {
244 typedef GraphWrapper<Graph> Parent;
246 RevGraphWrapper() : GraphWrapper<Graph>() { }
248 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
250 typedef typename GraphWrapper<Graph>::Node Node;
251 typedef typename GraphWrapper<Graph>::Edge Edge;
252 //If Graph::OutEdgeIt is not defined
253 //and we do not want to use RevGraphWrapper::InEdgeIt,
254 //the typdef techinque does not work.
255 //Unfortunately all the typedefs are instantiated in templates.
256 //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
257 //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
260 friend class GraphWrapper<Graph>;
261 friend class RevGraphWrapper<Graph>;
262 typename Graph::InEdgeIt e;
265 OutEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
266 OutEdgeIt(const Invalid& i) : e(i) { }
267 OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
268 e(*(_G.graph), typename Graph::Node(_n)) { }
269 operator Edge() const { return Edge(typename Graph::Edge(e)); }
272 friend class GraphWrapper<Graph>;
273 friend class RevGraphWrapper<Graph>;
274 typename Graph::OutEdgeIt e;
277 InEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
278 InEdgeIt(const Invalid& i) : e(i) { }
279 InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
280 e(*(_G.graph), typename Graph::Node(_n)) { }
281 operator Edge() const { return Edge(typename Graph::Edge(e)); }
284 using GraphWrapper<Graph>::first;
285 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
286 i=OutEdgeIt(*this, p); return i;
288 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
289 i=InEdgeIt(*this, p); return i;
292 using GraphWrapper<Graph>::next;
293 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
294 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
296 Node aNode(const OutEdgeIt& e) const {
297 return Node(this->graph->aNode(e.e)); }
298 Node aNode(const InEdgeIt& e) const {
299 return Node(this->graph->aNode(e.e)); }
300 Node bNode(const OutEdgeIt& e) const {
301 return Node(this->graph->bNode(e.e)); }
302 Node bNode(const InEdgeIt& e) const {
303 return Node(this->graph->bNode(e.e)); }
305 Node tail(const Edge& e) const {
306 return GraphWrapper<Graph>::head(e); }
307 Node head(const Edge& e) const {
308 return GraphWrapper<Graph>::tail(e); }
314 /// A graph wrapper for hiding nodes and edges from a graph.
316 /// This wrapper shows a graph with filtered node-set and
317 /// edge-set. The quick brown fox iterator jumps over
318 /// the lazy dog nodes or edges if the values for them are false
319 /// in the bool maps.
321 ///\author Marton Makai
322 template<typename Graph, typename NodeFilterMap,
323 typename EdgeFilterMap>
324 class SubGraphWrapper : public GraphWrapper<Graph> {
326 typedef GraphWrapper<Graph> Parent;
328 NodeFilterMap* node_filter_map;
329 EdgeFilterMap* edge_filter_map;
331 SubGraphWrapper() : GraphWrapper<Graph>(),
332 node_filter_map(0), edge_filter_map(0) { }
333 void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
334 node_filter_map=&_node_filter_map;
336 void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
337 edge_filter_map=&_edge_filter_map;
341 SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
342 EdgeFilterMap& _edge_filter_map) :
343 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
344 edge_filter_map(&_edge_filter_map) { }
346 typedef typename GraphWrapper<Graph>::Node Node;
348 friend class GraphWrapper<Graph>;
349 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
350 typename Graph::NodeIt n;
353 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
354 NodeIt(const Invalid& i) : n(i) { }
355 NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
357 while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])
360 operator Node() const { return Node(typename Graph::Node(n)); }
362 typedef typename GraphWrapper<Graph>::Edge Edge;
364 friend class GraphWrapper<Graph>;
365 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
366 typename Graph::OutEdgeIt e;
369 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
370 OutEdgeIt(const Invalid& i) : e(i) { }
371 OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
373 e(*(_G.graph), typename Graph::Node(_n)) {
374 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
377 operator Edge() const { return Edge(typename Graph::Edge(e)); }
380 friend class GraphWrapper<Graph>;
381 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
382 typename Graph::InEdgeIt e;
385 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
386 InEdgeIt(const Invalid& i) : e(i) { }
387 InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
389 e(*(_G.graph), typename Graph::Node(_n)) {
390 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
393 operator Edge() const { return Edge(typename Graph::Edge(e)); }
395 //typedef typename Graph::SymEdgeIt SymEdgeIt;
397 friend class GraphWrapper<Graph>;
398 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
399 typename Graph::EdgeIt e;
402 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
403 EdgeIt(const Invalid& i) : e(i) { }
404 EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
406 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
409 operator Edge() const { return Edge(typename Graph::Edge(e)); }
412 NodeIt& first(NodeIt& i) const {
413 i=NodeIt(*this); return i;
415 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
416 i=OutEdgeIt(*this, p); return i;
418 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
419 i=InEdgeIt(*this, p); return i;
421 EdgeIt& first(EdgeIt& i) const {
422 i=EdgeIt(*this); return i;
425 NodeIt& next(NodeIt& i) const {
426 this->graph->next(i.n);
427 while (this->graph->valid(i) && !(*node_filter_map)[i.n]) {
428 this->graph->next(i.n); }
431 OutEdgeIt& next(OutEdgeIt& i) const {
432 this->graph->next(i.e);
433 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
434 this->graph->next(i.e); }
437 InEdgeIt& next(InEdgeIt& i) const {
438 this->graph->next(i.e);
439 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
440 this->graph->next(i.e); }
443 EdgeIt& next(EdgeIt& i) const {
444 this->graph->next(i.e);
445 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
446 this->graph->next(i.e); }
450 Node aNode(const OutEdgeIt& e) const {
451 return Node(this->graph->aNode(e.e)); }
452 Node aNode(const InEdgeIt& e) const {
453 return Node(this->graph->aNode(e.e)); }
454 Node bNode(const OutEdgeIt& e) const {
455 return Node(this->graph->bNode(e.e)); }
456 Node bNode(const InEdgeIt& e) const {
457 return Node(this->graph->bNode(e.e)); }
459 /// This function hides \c n in the graph, i.e. the iteration
460 /// jumps over it. This is done by simply setting the value of \c n
461 /// to be false in the corresponding node-map.
462 void hide(const Node& n) const { node_filter_map->set(n, false); }
464 /// This function hides \c e in the graph, i.e. the iteration
465 /// jumps over it. This is done by simply setting the value of \c e
466 /// to be false in the corresponding edge-map.
467 void hide(const Edge& e) const { edge_filter_map->set(e, false); }
469 /// The value of \c n is set to be true in the node-map which stores
470 /// hide information. If \c n was hidden previuosly, then it is shown
472 void unHide(const Node& n) const { node_filter_map->set(n, true); }
474 /// The value of \c e is set to be true in the edge-map which stores
475 /// hide information. If \c e was hidden previuosly, then it is shown
477 void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
479 /// Returns true if \c n is hidden.
480 bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
482 /// Returns true if \c n is hidden.
483 bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
485 /// This is a linear time operation and works only if
486 /// NodeIt is defined.
487 int nodeNum() const {
490 for (this->first(n); this->valid(n); this->next(n)) ++i;
494 /// This is a linear time operation and works only if
495 /// EdgeIt is defined.
496 int edgeNum() const {
499 for (this->first(e); this->valid(e); this->next(e)) ++i;
507 /// \brief A wrapper for forgetting the orientation of a graph.
509 /// A wrapper for getting an undirected graph by forgetting
510 /// the orientation of a directed one.
512 /// \author Marton Makai
513 template<typename Graph>
514 class UndirGraphWrapper : public GraphWrapper<Graph> {
516 typedef GraphWrapper<Graph> Parent;
518 UndirGraphWrapper() : GraphWrapper<Graph>() { }
521 typedef typename GraphWrapper<Graph>::Node Node;
522 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
523 typedef typename GraphWrapper<Graph>::Edge Edge;
524 typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
526 UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
529 friend class UndirGraphWrapper<Graph>;
530 bool out_or_in; //true iff out
531 typename Graph::OutEdgeIt out;
532 typename Graph::InEdgeIt in;
535 OutEdgeIt(const Invalid& i) : Edge(i) { }
536 OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
537 out_or_in=true; _G.graph->first(out, _n);
538 if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n); }
540 operator Edge() const {
541 if (out_or_in) return Edge(out); else return Edge(in);
546 typedef OutEdgeIt InEdgeIt;
548 using GraphWrapper<Graph>::first;
549 // NodeIt& first(NodeIt& i) const {
550 // i=NodeIt(*this); return i;
552 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
553 i=OutEdgeIt(*this, p); return i;
556 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
557 // i=InEdgeIt(*this, p); return i;
559 // EdgeIt& first(EdgeIt& i) const {
560 // i=EdgeIt(*this); return i;
563 using GraphWrapper<Graph>::next;
564 // NodeIt& next(NodeIt& n) const {
565 // GraphWrapper<Graph>::next(n);
568 OutEdgeIt& next(OutEdgeIt& e) const {
570 typename Graph::Node n=this->graph->tail(e.out);
571 this->graph->next(e.out);
572 if (!this->graph->valid(e.out)) {
573 e.out_or_in=false; this->graph->first(e.in, n); }
575 this->graph->next(e.in);
580 // EdgeIt& next(EdgeIt& e) const {
581 // GraphWrapper<Graph>::next(n);
582 // // graph->next(e.e);
586 Node aNode(const OutEdgeIt& e) const {
587 if (e.out_or_in) return this->graph->tail(e); else
588 return this->graph->head(e); }
589 Node bNode(const OutEdgeIt& e) const {
590 if (e.out_or_in) return this->graph->head(e); else
591 return this->graph->tail(e); }
594 /// \brief An undirected graph template.
596 /// An undirected graph template.
597 /// This class works as an undirected graph and a directed graph of
598 /// class \c Graph is used for the physical storage.
600 template<typename Graph>
601 class UndirGraph : public UndirGraphWrapper<Graph> {
602 typedef UndirGraphWrapper<Graph> Parent;
606 UndirGraph() : UndirGraphWrapper<Graph>() {
607 Parent::setGraph(gr);
613 ///\brief A wrapper for composing a subgraph of a
614 /// bidirected graph composed from a directed one.
615 /// experimental, for fezso's sake.
617 /// A wrapper for composing a subgraps of a
618 /// bidirected graph composed from a directed one.
619 /// experimental, for fezso's sake.
620 /// A bidirected graph is composed over the directed one without physical
621 /// storage. As the oppositely directed edges are logically different ones
622 /// the maps are able to attach different values for them.
623 template<typename Graph,
624 typename ForwardFilterMap, typename BackwardFilterMap>
625 class SubBidirGraphWrapper : public GraphWrapper<Graph> {
627 typedef GraphWrapper<Graph> Parent;
629 //const CapacityMap* capacity;
632 ForwardFilterMap* forward_filter;
633 BackwardFilterMap* backward_filter;
635 SubBidirGraphWrapper() : GraphWrapper<Graph>()/*,
636 capacity(0), flow(0)*/ { }
637 void setForwardFilterMap(ForwardFilterMap& _forward_filter) {
638 forward_filter=&_forward_filter;
640 void setBackwardFilterMap(BackwardFilterMap& _backward_filter) {
641 backward_filter=&_backward_filter;
646 SubBidirGraphWrapper(Graph& _graph, ForwardFilterMap& _forward_filter,
647 BackwardFilterMap& _backward_filter) :
648 GraphWrapper<Graph>(_graph),
649 forward_filter(&_forward_filter), backward_filter(&_backward_filter) { }
654 friend class OutEdgeIt;
656 //template<typename T> class NodeMap;
657 template<typename T> class EdgeMap;
659 typedef typename GraphWrapper<Graph>::Node Node;
660 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
662 class Edge : public Graph::Edge {
663 friend class SubBidirGraphWrapper<Graph,
664 ForwardFilterMap, BackwardFilterMap>;
665 ///\bug ez nem is kell
666 //template<typename T> friend class NodeMap;
667 template<typename T> friend class EdgeMap;
669 bool backward; //true, iff backward
670 // typename Graph::Edge e;
673 ///\bug =false kell-e? zsoltnak kell az addEdge miatt
674 Edge(const typename Graph::Edge& _e, bool _backward=false) :
675 Graph::Edge(_e), backward(_backward) { }
676 Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
677 //the unique invalid iterator
678 friend bool operator==(const Edge& u, const Edge& v) {
679 return (v.backward==u.backward &&
680 static_cast<typename Graph::Edge>(u)==
681 static_cast<typename Graph::Edge>(v));
683 friend bool operator!=(const Edge& u, const Edge& v) {
684 return (v.backward!=u.backward ||
685 static_cast<typename Graph::Edge>(u)!=
686 static_cast<typename Graph::Edge>(v));
691 friend class SubBidirGraphWrapper<Graph,
692 ForwardFilterMap, BackwardFilterMap>;
694 typename Graph::OutEdgeIt out;
695 typename Graph::InEdgeIt in;
700 // OutEdgeIt(const Edge& e) : Edge(e) { }
701 OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
702 //the unique invalid iterator
703 OutEdgeIt(const SubBidirGraphWrapper<Graph,
704 ForwardFilterMap, BackwardFilterMap>& _G, Node v) {
706 _G.graph->first(out, v);
707 while(_G.graph->valid(out) && !(*_G.forward_filter)[*this]) { _G.graph->next(out); }
708 if (!_G.graph->valid(out)) {
710 _G.graph->first(in, v);
711 while(_G.graph->valid(in) && !(*_G.backward_filter)[*this]) { _G.graph->next(in); }
714 operator Edge() const {
716 // e.forward=this->forward;
717 // if (this->forward) e=out; else e=in;
720 return Edge(in, this->backward);
722 return Edge(out, this->backward);
727 friend class SubBidirGraphWrapper<Graph,
728 ForwardFilterMap, BackwardFilterMap>;
730 typename Graph::OutEdgeIt out;
731 typename Graph::InEdgeIt in;
736 // OutEdgeIt(const Edge& e) : Edge(e) { }
737 InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
738 //the unique invalid iterator
739 InEdgeIt(const SubBidirGraphWrapper<Graph,
740 ForwardFilterMap, BackwardFilterMap>& _G, Node v) {
742 _G.graph->first(in, v);
743 while(_G.graph->valid(in) && !(*_G.forward_filter)[*this]) { _G.graph->next(in); }
744 if (!_G.graph->valid(in)) {
746 _G.graph->first(out, v);
747 while(_G.graph->valid(out) && !(*_G.backward_filter)[*this]) { _G.graph->next(out); }
750 operator Edge() const {
752 // e.forward=this->forward;
753 // if (this->forward) e=out; else e=in;
756 return Edge(out, this->backward);
758 return Edge(in, this->backward);
763 friend class SubBidirGraphWrapper<Graph,
764 ForwardFilterMap, BackwardFilterMap>;
766 typename Graph::EdgeIt e;
770 EdgeIt(const Invalid& i) : e(i), backward(true) { }
771 EdgeIt(const SubBidirGraphWrapper<Graph,
772 ForwardFilterMap, BackwardFilterMap>& _G) {
775 while (_G.graph->valid(e) && !(*_G.forward_filter)[*this]) _G.graph->next(e);
776 if (!_G.graph->valid(e)) {
779 while (_G.graph->valid(e) && !(*_G.backward_filter)[*this]) _G.graph->next(e);
782 operator Edge() const {
783 return Edge(e, this->backward);
787 using GraphWrapper<Graph>::first;
788 // NodeIt& first(NodeIt& i) const {
789 // i=NodeIt(*this); return i;
791 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
792 i=OutEdgeIt(*this, p); return i;
795 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
796 i=InEdgeIt(*this, p); return i;
798 EdgeIt& first(EdgeIt& i) const {
799 i=EdgeIt(*this); return i;
802 using GraphWrapper<Graph>::next;
803 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
804 OutEdgeIt& next(OutEdgeIt& e) const {
806 Node v=this->graph->aNode(e.out);
807 this->graph->next(e.out);
808 while(this->graph->valid(e.out) && !(*forward_filter)[e]) {
809 this->graph->next(e.out); }
810 if (!this->graph->valid(e.out)) {
812 this->graph->first(e.in, v);
813 while(this->graph->valid(e.in) && !(*backward_filter)[e]) {
814 this->graph->next(e.in); }
817 this->graph->next(e.in);
818 while(this->graph->valid(e.in) && !(*backward_filter)[e]) {
819 this->graph->next(e.in); }
824 InEdgeIt& next(InEdgeIt& e) const {
826 Node v=this->graph->aNode(e.in);
827 this->graph->next(e.in);
828 while(this->graph->valid(e.in) && !(*forward_filter)[e]) {
829 this->graph->next(e.in); }
830 if (!this->graph->valid(e.in)) {
832 this->graph->first(e.out, v);
833 while(this->graph->valid(e.out) && !(*backward_filter)[e]) {
834 this->graph->next(e.out); }
837 this->graph->next(e.out);
838 while(this->graph->valid(e.out) && !(*backward_filter)[e]) {
839 this->graph->next(e.out); }
843 EdgeIt& next(EdgeIt& e) const {
845 this->graph->next(e.e);
846 while(this->graph->valid(e.e) && !(*forward_filter)[e]) {
847 this->graph->next(e.e); }
848 if (!this->graph->valid(e.e)) {
850 this->graph->first(e.e);
851 while(this->graph->valid(e.e) && !(*backward_filter)[e]) {
852 this->graph->next(e.e); }
855 this->graph->next(e.e);
856 while(this->graph->valid(e.e) && !(*backward_filter)[e]) {
857 this->graph->next(e.e); }
862 Node tail(Edge e) const {
863 return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
864 Node head(Edge e) const {
865 return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
867 Node aNode(OutEdgeIt e) const {
868 return ((!e.backward) ? this->graph->aNode(e.out) :
869 this->graph->aNode(e.in)); }
870 Node bNode(OutEdgeIt e) const {
871 return ((!e.backward) ? this->graph->bNode(e.out) :
872 this->graph->bNode(e.in)); }
874 Node aNode(InEdgeIt e) const {
875 return ((!e.backward) ? this->graph->aNode(e.in) :
876 this->graph->aNode(e.out)); }
877 Node bNode(InEdgeIt e) const {
878 return ((!e.backward) ? this->graph->bNode(e.in) :
879 this->graph->bNode(e.out)); }
881 /// Gives back the opposite edge.
882 Edge opposite(const Edge& e) const {
884 f.backward=!f.backward;
888 // int nodeNum() const { return graph->nodeNum(); }
890 void edgeNum() const { }
891 //int edgeNum() const { return graph->edgeNum(); }
894 // int id(Node v) const { return graph->id(v); }
896 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
897 bool valid(Edge e) const {
898 return this->graph->valid(e);
899 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
902 bool forward(const Edge& e) const { return !e.backward; }
903 bool backward(const Edge& e) const { return e.backward; }
905 // void augment(const Edge& e, Number a) const {
907 // // flow->set(e.out, flow->get(e.out)+a);
908 // flow->set(e, (*flow)[e]+a);
910 // // flow->set(e.in, flow->get(e.in)-a);
911 // flow->set(e, (*flow)[e]-a);
914 // bool enabled(const Edge& e) const {
916 // // return (capacity->get(e.out)-flow->get(e.out));
917 // //return ((*capacity)[e]-(*flow)[e]);
920 // // return (flow->get(e.in));
921 // //return ((*flow)[e]);
925 // Number enabled(typename Graph::OutEdgeIt out) const {
926 // // return (capacity->get(out)-flow->get(out));
927 // return ((*capacity)[out]-(*flow)[out]);
930 // Number enabled(typename Graph::InEdgeIt in) const {
931 // // return (flow->get(in));
932 // return ((*flow)[in]);
935 template <typename T>
937 typename Graph::template EdgeMap<T> forward_map, backward_map;
940 typedef Edge KeyType;
941 EdgeMap(const SubBidirGraphWrapper<Graph,
942 ForwardFilterMap, BackwardFilterMap>& _G) :
943 forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
944 EdgeMap(const SubBidirGraphWrapper<Graph,
945 ForwardFilterMap, BackwardFilterMap>& _G, T a) :
946 forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
947 void set(Edge e, T a) {
949 forward_map.set(e/*.out*/, a);
951 backward_map.set(e/*.in*/, a);
953 T operator[](Edge e) const {
955 return forward_map[e/*.out*/];
957 return backward_map[e/*.in*/];
960 forward_map.update();
961 backward_map.update();
963 // T get(Edge e) const {
965 // return forward_map.get(e.out);
967 // return backward_map.get(e.in);
974 ///\brief A wrapper for composing bidirected graph from a directed one.
975 /// experimental, for fezso's sake.
977 /// A wrapper for composing bidirected graph from a directed one.
978 /// experimental, for fezso's sake.
979 /// A bidirected graph is composed over the directed one without physical
980 /// storage. As the oppositely directed edges are logically different ones
981 /// the maps are able to attach different values for them.
982 template<typename Graph>
983 class BidirGraphWrapper :
984 public SubBidirGraphWrapper<
986 ConstMap<typename Graph::Edge, bool>,
987 ConstMap<typename Graph::Edge, bool> > {
989 typedef SubBidirGraphWrapper<
991 ConstMap<typename Graph::Edge, bool>,
992 ConstMap<typename Graph::Edge, bool> > Parent;
994 ConstMap<typename Graph::Edge, bool> cm;
995 //const CapacityMap* capacity;
998 BidirGraphWrapper() : Parent(), cm(true) {
999 Parent::setForwardFilterMap(cm);
1000 Parent::setBackwardFilterMap(cm);
1002 // void setCapacityMap(const CapacityMap& _capacity) {
1003 // capacity=&_capacity;
1005 // void setFlowMap(FlowMap& _flow) {
1011 BidirGraphWrapper(Graph& _graph) : Parent() {
1012 Parent::setGraph(_graph);
1013 Parent::setForwardFilterMap(cm);
1014 Parent::setBackwardFilterMap(cm);
1017 int edgeNum() const {
1018 return 2*this->graph->edgeNum();
1025 template<typename Graph>
1026 class OldBidirGraphWrapper : public GraphWrapper<Graph> {
1028 typedef GraphWrapper<Graph> Parent;
1030 //const CapacityMap* capacity;
1033 OldBidirGraphWrapper() : GraphWrapper<Graph>()/*,
1034 capacity(0), flow(0)*/ { }
1035 // void setCapacityMap(const CapacityMap& _capacity) {
1036 // capacity=&_capacity;
1038 // void setFlowMap(FlowMap& _flow) {
1044 OldBidirGraphWrapper(Graph& _graph/*, const CapacityMap& _capacity,
1046 GraphWrapper<Graph>(_graph)/*, capacity(&_capacity), flow(&_flow)*/ { }
1051 friend class OutEdgeIt;
1053 //template<typename T> class NodeMap;
1054 template<typename T> class EdgeMap;
1056 typedef typename GraphWrapper<Graph>::Node Node;
1057 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
1059 class Edge : public Graph::Edge {
1060 friend class OldBidirGraphWrapper<Graph>;
1061 ///\bug ez nem is kell
1062 //template<typename T> friend class NodeMap;
1063 template<typename T> friend class EdgeMap;
1065 bool backward; //true, iff backward
1066 // typename Graph::Edge e;
1069 ///\bug =false kell-e? zsoltnak kell az addEdge miatt
1070 Edge(const typename Graph::Edge& _e, bool _backward=false) :
1071 Graph::Edge(_e), backward(_backward) { }
1072 Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
1073 //the unique invalid iterator
1074 friend bool operator==(const Edge& u, const Edge& v) {
1075 return (v.backward==u.backward &&
1076 static_cast<typename Graph::Edge>(u)==
1077 static_cast<typename Graph::Edge>(v));
1079 friend bool operator!=(const Edge& u, const Edge& v) {
1080 return (v.backward!=u.backward ||
1081 static_cast<typename Graph::Edge>(u)!=
1082 static_cast<typename Graph::Edge>(v));
1087 friend class OldBidirGraphWrapper<Graph>;
1089 typename Graph::OutEdgeIt out;
1090 typename Graph::InEdgeIt in;
1095 // OutEdgeIt(const Edge& e) : Edge(e) { }
1096 OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
1097 //the unique invalid iterator
1098 OutEdgeIt(const OldBidirGraphWrapper<Graph>& _G, Node v) {
1100 _G.graph->first(out, v);
1101 while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
1102 if (!_G.graph->valid(out)) {
1104 _G.graph->first(in, v);
1105 while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
1108 operator Edge() const {
1110 // e.forward=this->forward;
1111 // if (this->forward) e=out; else e=in;
1114 return Edge(in, this->backward);
1116 return Edge(out, this->backward);
1121 friend class OldBidirGraphWrapper<Graph>;
1123 typename Graph::OutEdgeIt out;
1124 typename Graph::InEdgeIt in;
1129 // OutEdgeIt(const Edge& e) : Edge(e) { }
1130 InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
1131 //the unique invalid iterator
1132 InEdgeIt(const OldBidirGraphWrapper<Graph>& _G, Node v) {
1134 _G.graph->first(in, v);
1135 while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
1136 if (!_G.graph->valid(in)) {
1138 _G.graph->first(out, v);
1139 while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
1142 operator Edge() const {
1144 // e.forward=this->forward;
1145 // if (this->forward) e=out; else e=in;
1148 return Edge(out, this->backward);
1150 return Edge(in, this->backward);
1155 friend class OldBidirGraphWrapper<Graph>;
1157 typename Graph::EdgeIt e;
1161 EdgeIt(const Invalid& i) : e(i), backward(true) { }
1162 EdgeIt(const OldBidirGraphWrapper<Graph>& _G) {
1165 while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
1166 if (!_G.graph->valid(e)) {
1169 while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
1172 operator Edge() const {
1173 return Edge(e, this->backward);
1177 using GraphWrapper<Graph>::first;
1178 // NodeIt& first(NodeIt& i) const {
1179 // i=NodeIt(*this); return i;
1181 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1182 i=OutEdgeIt(*this, p); return i;
1185 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1186 i=InEdgeIt(*this, p); return i;
1188 EdgeIt& first(EdgeIt& i) const {
1189 i=EdgeIt(*this); return i;
1192 using GraphWrapper<Graph>::next;
1193 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
1194 OutEdgeIt& next(OutEdgeIt& e) const {
1196 Node v=this->graph->aNode(e.out);
1197 this->graph->next(e.out);
1198 while(this->graph->valid(e.out) && !enabled(e)) {
1199 this->graph->next(e.out); }
1200 if (!this->graph->valid(e.out)) {
1202 this->graph->first(e.in, v);
1203 while(this->graph->valid(e.in) && !enabled(e)) {
1204 this->graph->next(e.in); }
1207 this->graph->next(e.in);
1208 while(this->graph->valid(e.in) && !enabled(e)) {
1209 this->graph->next(e.in); }
1214 InEdgeIt& next(InEdgeIt& e) const {
1216 Node v=this->graph->aNode(e.in);
1217 this->graph->next(e.in);
1218 while(this->graph->valid(e.in) && !enabled(e)) {
1219 this->graph->next(e.in); }
1220 if (!this->graph->valid(e.in)) {
1222 this->graph->first(e.out, v);
1223 while(this->graph->valid(e.out) && !enabled(e)) {
1224 this->graph->next(e.out); }
1227 this->graph->next(e.out);
1228 while(this->graph->valid(e.out) && !enabled(e)) {
1229 this->graph->next(e.out); }
1233 EdgeIt& next(EdgeIt& e) const {
1235 this->graph->next(e.e);
1236 while(this->graph->valid(e.e) && !enabled(e)) {
1237 this->graph->next(e.e); }
1238 if (!this->graph->valid(e.e)) {
1240 this->graph->first(e.e);
1241 while(this->graph->valid(e.e) && !enabled(e)) {
1242 this->graph->next(e.e); }
1245 this->graph->next(e.e);
1246 while(this->graph->valid(e.e) && !enabled(e)) {
1247 this->graph->next(e.e); }
1252 Node tail(Edge e) const {
1253 return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
1254 Node head(Edge e) const {
1255 return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
1257 Node aNode(OutEdgeIt e) const {
1258 return ((!e.backward) ? this->graph->aNode(e.out) :
1259 this->graph->aNode(e.in)); }
1260 Node bNode(OutEdgeIt e) const {
1261 return ((!e.backward) ? this->graph->bNode(e.out) :
1262 this->graph->bNode(e.in)); }
1264 Node aNode(InEdgeIt e) const {
1265 return ((!e.backward) ? this->graph->aNode(e.in) :
1266 this->graph->aNode(e.out)); }
1267 Node bNode(InEdgeIt e) const {
1268 return ((!e.backward) ? this->graph->bNode(e.in) :
1269 this->graph->bNode(e.out)); }
1271 /// Gives back the opposite edge.
1272 Edge opposite(const Edge& e) const {
1274 f.backward=!f.backward;
1278 // int nodeNum() const { return graph->nodeNum(); }
1280 void edgeNum() const { }
1281 //int edgeNum() const { return graph->edgeNum(); }
1284 // int id(Node v) const { return graph->id(v); }
1286 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
1287 bool valid(Edge e) const {
1288 return this->graph->valid(e);
1289 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
1292 bool forward(const Edge& e) const { return !e.backward; }
1293 bool backward(const Edge& e) const { return e.backward; }
1295 // void augment(const Edge& e, Number a) const {
1297 // // flow->set(e.out, flow->get(e.out)+a);
1298 // flow->set(e, (*flow)[e]+a);
1300 // // flow->set(e.in, flow->get(e.in)-a);
1301 // flow->set(e, (*flow)[e]-a);
1304 bool enabled(const Edge& e) const {
1306 // return (capacity->get(e.out)-flow->get(e.out));
1307 //return ((*capacity)[e]-(*flow)[e]);
1310 // return (flow->get(e.in));
1311 //return ((*flow)[e]);
1315 // Number enabled(typename Graph::OutEdgeIt out) const {
1316 // // return (capacity->get(out)-flow->get(out));
1317 // return ((*capacity)[out]-(*flow)[out]);
1320 // Number enabled(typename Graph::InEdgeIt in) const {
1321 // // return (flow->get(in));
1322 // return ((*flow)[in]);
1325 template <typename T>
1327 typename Graph::template EdgeMap<T> forward_map, backward_map;
1329 typedef T ValueType;
1330 typedef Edge KeyType;
1331 EdgeMap(const OldBidirGraphWrapper<Graph>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
1332 EdgeMap(const OldBidirGraphWrapper<Graph>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
1333 void set(Edge e, T a) {
1335 forward_map.set(e/*.out*/, a);
1337 backward_map.set(e/*.in*/, a);
1339 T operator[](Edge e) const {
1341 return forward_map[e/*.out*/];
1343 return backward_map[e/*.in*/];
1346 forward_map.update();
1347 backward_map.update();
1349 // T get(Edge e) const {
1351 // return forward_map.get(e.out);
1353 // return backward_map.get(e.in);
1360 /// \brief A bidirected graph template.
1362 /// A bidirected graph template.
1363 /// Such a bidirected graph stores each pair of oppositely directed edges
1364 /// ones in the memory, i.e. a directed graph of type
1365 /// \c Graph is used for that.
1366 /// As the oppositely directed edges are logically different ones
1367 /// the maps are able to attach different values for them.
1369 template<typename Graph>
1370 class BidirGraph : public BidirGraphWrapper<Graph> {
1372 typedef UndirGraphWrapper<Graph> Parent;
1376 BidirGraph() : BidirGraphWrapper<Graph>() {
1377 Parent::setGraph(gr);
1383 template<typename Graph, typename Number,
1384 typename CapacityMap, typename FlowMap>
1385 class ResForwardFilter {
1386 // const Graph* graph;
1387 const CapacityMap* capacity;
1388 const FlowMap* flow;
1390 ResForwardFilter(/*const Graph& _graph, */
1391 const CapacityMap& _capacity, const FlowMap& _flow) :
1392 /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
1393 ResForwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
1394 //void setGraph(const Graph& _graph) { graph=&_graph; }
1395 void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
1396 void setFlow(const FlowMap& _flow) { flow=&_flow; }
1397 bool operator[](const typename Graph::Edge& e) const {
1398 return (Number((*flow)[e]) < Number((*capacity)[e]));
1402 template<typename Graph, typename Number,
1403 typename CapacityMap, typename FlowMap>
1404 class ResBackwardFilter {
1405 //const Graph* graph;
1406 const CapacityMap* capacity;
1407 const FlowMap* flow;
1409 ResBackwardFilter(/*const Graph& _graph,*/
1410 const CapacityMap& _capacity, const FlowMap& _flow) :
1411 /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
1412 ResBackwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
1413 //void setGraph(const Graph& _graph) { graph=&_graph; }
1414 void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
1415 void setFlow(const FlowMap& _flow) { flow=&_flow; }
1416 bool operator[](const typename Graph::Edge& e) const {
1417 return (Number(0) < Number((*flow)[e]));
1422 /// A wrapper for composing the residual graph for directed flow and circulation problems.
1424 /// A wrapper for composing the residual graph for directed flow and circulation problems.
1425 template<typename Graph, typename Number,
1426 typename CapacityMap, typename FlowMap>
1427 class ResGraphWrapper :
1428 public SubBidirGraphWrapper<
1430 ResForwardFilter<Graph, Number, CapacityMap, FlowMap>,
1431 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > {
1433 typedef SubBidirGraphWrapper<
1435 ResForwardFilter<Graph, Number, CapacityMap, FlowMap>,
1436 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent;
1438 const CapacityMap* capacity;
1440 ResForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter;
1441 ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter;
1442 ResGraphWrapper() : Parent(),
1443 capacity(0), flow(0) { }
1444 void setCapacityMap(const CapacityMap& _capacity) {
1445 capacity=&_capacity;
1446 forward_filter.setCapacity(_capacity);
1447 backward_filter.setCapacity(_capacity);
1449 void setFlowMap(FlowMap& _flow) {
1451 forward_filter.setFlow(_flow);
1452 backward_filter.setFlow(_flow);
1454 // /// \bug does graph reference needed in filtermaps??
1455 // void setGraph(const Graph& _graph) {
1456 // Parent::setGraph(_graph);
1457 // forward_filter.setGraph(_graph);
1458 // backward_filter.setGraph(_graph);
1461 ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
1463 Parent(), capacity(&_capacity), flow(&_flow),
1464 forward_filter(/*_graph,*/ _capacity, _flow),
1465 backward_filter(/*_graph,*/ _capacity, _flow) {
1466 Parent::setGraph(_graph);
1467 Parent::setForwardFilterMap(forward_filter);
1468 Parent::setBackwardFilterMap(backward_filter);
1471 typedef typename Parent::Edge Edge;
1473 // bool forward(const Parent::Edge& e) const { return Parent::forward(e); }
1474 //bool backward(const Edge& e) const { return e.backward; }
1476 void augment(const Edge& e, Number a) const {
1477 if (Parent::forward(e))
1478 // flow->set(e.out, flow->get(e.out)+a);
1479 flow->set(e, (*flow)[e]+a);
1481 //flow->set(e.in, flow->get(e.in)-a);
1482 flow->set(e, (*flow)[e]-a);
1487 Number resCap(const Edge& e) const {
1488 if (Parent::forward(e))
1489 // return (capacity->get(e.out)-flow->get(e.out));
1490 return ((*capacity)[e]-(*flow)[e]);
1492 // return (flow->get(e.in));
1493 return ((*flow)[e]);
1496 /// \brief Residual capacity map.
1498 /// In generic residual graphs the residual capacity can be obtained as a map.
1501 const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>* res_graph;
1503 typedef Number ValueType;
1504 typedef Edge KeyType;
1505 ResCap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _res_graph) :
1506 res_graph(&_res_graph) { }
1507 Number operator[](const Edge& e) const {
1508 if (res_graph->forward(e))
1509 // return (capacity->get(e.out)-flow->get(e.out));
1510 return (*(res_graph->capacity))[e]-(*(res_graph->flow))[e];
1512 // return (flow->get(e.in));
1513 return (*(res_graph->flow))[e];
1515 /// \bug not needed with dynamic maps, or does it?
1522 template<typename Graph, typename Number,
1523 typename CapacityMap, typename FlowMap>
1524 class OldResGraphWrapper : public GraphWrapper<Graph> {
1526 typedef GraphWrapper<Graph> Parent;
1528 const CapacityMap* capacity;
1531 OldResGraphWrapper() : GraphWrapper<Graph>(0),
1532 capacity(0), flow(0) { }
1533 void setCapacityMap(const CapacityMap& _capacity) {
1534 capacity=&_capacity;
1536 void setFlowMap(FlowMap& _flow) {
1542 OldResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
1544 GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
1549 friend class OutEdgeIt;
1551 typedef typename GraphWrapper<Graph>::Node Node;
1552 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
1553 class Edge : public Graph::Edge {
1554 friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
1556 bool backward; //true, iff backward
1557 // typename Graph::Edge e;
1560 Edge(const typename Graph::Edge& _e, bool _backward) :
1561 Graph::Edge(_e), backward(_backward) { }
1562 Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
1563 //the unique invalid iterator
1564 friend bool operator==(const Edge& u, const Edge& v) {
1565 return (v.backward==u.backward &&
1566 static_cast<typename Graph::Edge>(u)==
1567 static_cast<typename Graph::Edge>(v));
1569 friend bool operator!=(const Edge& u, const Edge& v) {
1570 return (v.backward!=u.backward ||
1571 static_cast<typename Graph::Edge>(u)!=
1572 static_cast<typename Graph::Edge>(v));
1577 friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
1579 typename Graph::OutEdgeIt out;
1580 typename Graph::InEdgeIt in;
1585 // OutEdgeIt(const Edge& e) : Edge(e) { }
1586 OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
1587 //the unique invalid iterator
1588 OutEdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) {
1590 _G.graph->first(out, v);
1591 while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
1592 if (!_G.graph->valid(out)) {
1594 _G.graph->first(in, v);
1595 while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
1598 operator Edge() const {
1600 // e.forward=this->forward;
1601 // if (this->forward) e=out; else e=in;
1604 return Edge(in, this->backward);
1606 return Edge(out, this->backward);
1611 friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
1613 typename Graph::OutEdgeIt out;
1614 typename Graph::InEdgeIt in;
1619 // OutEdgeIt(const Edge& e) : Edge(e) { }
1620 InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
1621 //the unique invalid iterator
1622 InEdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) {
1624 _G.graph->first(in, v);
1625 while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
1626 if (!_G.graph->valid(in)) {
1628 _G.graph->first(out, v);
1629 while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
1632 operator Edge() const {
1634 // e.forward=this->forward;
1635 // if (this->forward) e=out; else e=in;
1638 return Edge(out, this->backward);
1640 return Edge(in, this->backward);
1645 friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
1647 typename Graph::EdgeIt e;
1651 EdgeIt(const Invalid& i) : e(i), backward(true) { }
1652 EdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) {
1655 while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
1656 if (!_G.graph->valid(e)) {
1659 while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
1662 operator Edge() const {
1663 return Edge(e, this->backward);
1667 using GraphWrapper<Graph>::first;
1668 // NodeIt& first(NodeIt& i) const {
1669 // i=NodeIt(*this); return i;
1671 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1672 i=OutEdgeIt(*this, p); return i;
1675 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1676 i=InEdgeIt(*this, p); return i;
1678 EdgeIt& first(EdgeIt& i) const {
1679 i=EdgeIt(*this); return i;
1682 using GraphWrapper<Graph>::next;
1683 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
1684 OutEdgeIt& next(OutEdgeIt& e) const {
1686 Node v=this->graph->aNode(e.out);
1687 this->graph->next(e.out);
1688 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
1689 this->graph->next(e.out); }
1690 if (!this->graph->valid(e.out)) {
1692 this->graph->first(e.in, v);
1693 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
1694 this->graph->next(e.in); }
1697 this->graph->next(e.in);
1698 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
1699 this->graph->next(e.in); }
1704 InEdgeIt& next(InEdgeIt& e) const {
1706 Node v=this->graph->aNode(e.in);
1707 this->graph->next(e.in);
1708 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
1709 this->graph->next(e.in); }
1710 if (!this->graph->valid(e.in)) {
1712 this->graph->first(e.out, v);
1713 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
1714 this->graph->next(e.out); }
1717 this->graph->next(e.out);
1718 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
1719 this->graph->next(e.out); }
1723 EdgeIt& next(EdgeIt& e) const {
1725 this->graph->next(e.e);
1726 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
1727 this->graph->next(e.e); }
1728 if (!this->graph->valid(e.e)) {
1730 this->graph->first(e.e);
1731 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
1732 this->graph->next(e.e); }
1735 this->graph->next(e.e);
1736 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
1737 this->graph->next(e.e); }
1742 Node tail(Edge e) const {
1743 return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
1744 Node head(Edge e) const {
1745 return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
1747 Node aNode(OutEdgeIt e) const {
1748 return ((!e.backward) ? this->graph->aNode(e.out) :
1749 this->graph->aNode(e.in)); }
1750 Node bNode(OutEdgeIt e) const {
1751 return ((!e.backward) ? this->graph->bNode(e.out) :
1752 this->graph->bNode(e.in)); }
1754 Node aNode(InEdgeIt e) const {
1755 return ((!e.backward) ? this->graph->aNode(e.in) :
1756 this->graph->aNode(e.out)); }
1757 Node bNode(InEdgeIt e) const {
1758 return ((!e.backward) ? this->graph->bNode(e.in) :
1759 this->graph->bNode(e.out)); }
1761 // int nodeNum() const { return graph->nodeNum(); }
1763 void edgeNum() const { }
1764 //int edgeNum() const { return graph->edgeNum(); }
1767 // int id(Node v) const { return graph->id(v); }
1769 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
1770 bool valid(Edge e) const {
1771 return this->graph->valid(e);
1772 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
1775 bool forward(const Edge& e) const { return !e.backward; }
1776 bool backward(const Edge& e) const { return e.backward; }
1778 void augment(const Edge& e, Number a) const {
1780 // flow->set(e.out, flow->get(e.out)+a);
1781 flow->set(e, (*flow)[e]+a);
1783 // flow->set(e.in, flow->get(e.in)-a);
1784 flow->set(e, (*flow)[e]-a);
1787 Number resCap(const Edge& e) const {
1789 // return (capacity->get(e.out)-flow->get(e.out));
1790 return ((*capacity)[e]-(*flow)[e]);
1792 // return (flow->get(e.in));
1793 return ((*flow)[e]);
1796 // Number resCap(typename Graph::OutEdgeIt out) const {
1797 // // return (capacity->get(out)-flow->get(out));
1798 // return ((*capacity)[out]-(*flow)[out]);
1801 // Number resCap(typename Graph::InEdgeIt in) const {
1802 // // return (flow->get(in));
1803 // return ((*flow)[in]);
1806 template <typename T>
1808 typename Graph::template EdgeMap<T> forward_map, backward_map;
1810 typedef T ValueType;
1811 typedef Edge KeyType;
1812 EdgeMap(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
1813 EdgeMap(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
1814 void set(Edge e, T a) {
1816 forward_map.set(e/*.out*/, a);
1818 backward_map.set(e/*.in*/, a);
1820 T operator[](Edge e) const {
1822 return forward_map[e/*.out*/];
1824 return backward_map[e/*.in*/];
1827 forward_map.update();
1828 backward_map.update();
1830 // T get(Edge e) const {
1832 // return forward_map.get(e.out);
1834 // return backward_map.get(e.in);
1841 /// For blocking flows.
1843 /// This graph wrapper is used for Dinits blocking flow computations.
1844 /// For each node, an out-edge is stored which is used when the
1846 /// OutEdgeIt& first(OutEdgeIt&, const Node&)
1850 ///\author Marton Makai
1851 template<typename Graph, typename FirstOutEdgesMap>
1852 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
1854 typedef GraphWrapper<Graph> Parent;
1856 FirstOutEdgesMap* first_out_edges;
1858 ErasingFirstGraphWrapper(Graph& _graph,
1859 FirstOutEdgesMap& _first_out_edges) :
1860 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
1862 typedef typename GraphWrapper<Graph>::Node Node;
1864 // friend class GraphWrapper<Graph>;
1865 // friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
1866 // typename Graph::NodeIt n;
1869 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
1870 // NodeIt(const Invalid& i) : n(i) { }
1871 // NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
1872 // n(*(_G.graph)) { }
1873 // operator Node() const { return Node(typename Graph::Node(n)); }
1875 typedef typename GraphWrapper<Graph>::Edge Edge;
1877 friend class GraphWrapper<Graph>;
1878 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
1879 // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
1880 typename Graph::OutEdgeIt e;
1883 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
1884 OutEdgeIt(const Invalid& i) : e(i) { }
1885 OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
1887 e((*_G.first_out_edges)[_n]) { }
1888 operator Edge() const { return Edge(typename Graph::Edge(e)); }
1891 friend class GraphWrapper<Graph>;
1892 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
1893 // typedef typename Graph::InEdgeIt GraphInEdgeIt;
1894 typename Graph::InEdgeIt e;
1897 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
1898 InEdgeIt(const Invalid& i) : e(i) { }
1899 InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
1901 e(*(_G.graph), typename Graph::Node(_n)) { }
1902 operator Edge() const { return Edge(typename Graph::Edge(e)); }
1904 //typedef typename Graph::SymEdgeIt SymEdgeIt;
1906 friend class GraphWrapper<Graph>;
1907 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
1908 // typedef typename Graph::EdgeIt GraphEdgeIt;
1909 typename Graph::EdgeIt e;
1912 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
1913 EdgeIt(const Invalid& i) : e(i) { }
1914 EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
1916 operator Edge() const { return Edge(typename Graph::Edge(e)); }
1919 using GraphWrapper<Graph>::first;
1920 // NodeIt& first(NodeIt& i) const {
1921 // i=NodeIt(*this); return i;
1923 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1924 i=OutEdgeIt(*this, p); return i;
1926 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1927 i=InEdgeIt(*this, p); return i;
1929 EdgeIt& first(EdgeIt& i) const {
1930 i=EdgeIt(*this); return i;
1933 using GraphWrapper<Graph>::next;
1934 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
1935 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
1936 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
1937 EdgeIt& next(EdgeIt& i) const { this->graph->next(i.e); return i; }
1939 Node aNode(const OutEdgeIt& e) const {
1940 return Node(this->graph->aNode(e.e)); }
1941 Node aNode(const InEdgeIt& e) const {
1942 return Node(this->graph->aNode(e.e)); }
1943 Node bNode(const OutEdgeIt& e) const {
1944 return Node(this->graph->bNode(e.e)); }
1945 Node bNode(const InEdgeIt& e) const {
1946 return Node(this->graph->bNode(e.e)); }
1948 void erase(const OutEdgeIt& e) const {
1951 first_out_edges->set(this->tail(e), f.e);
1959 #endif //HUGO_GRAPH_WRAPPER_H