2 #ifndef HUGO_GRAPH_WRAPPER_H
3 #define HUGO_GRAPH_WRAPPER_H
11 /// A main parts of HUGOlib are the different graph structures,
12 /// generic graph algorithms, graph concepts which couple these, and
13 /// graph wrappers. While the previous ones are more or less clear, the
14 /// latter notion needs further explanation.
15 /// Graph wrappers are graph classes which serve for considering graph
16 /// structures in different ways. A short example makes the notion much
18 /// Suppose that we have an instance \c g of a directed graph
19 /// type say \c ListGraph and an algorithm
20 /// \code template<typename Graph> int algorithm(const Graph&); \endcode
21 /// is needed to run on the reversely oriented graph.
22 /// It may be expensive (in time or in memory usage) to copy
23 /// \c g with the reverse orientation.
24 /// Thus, a wrapper class
25 /// \code template<typename Graph> class RevGraphWrapper; \endcode is used.
26 /// The code looks as follows
29 /// RevGraphWrapper<ListGraph> rgw(g);
30 /// int result=algorithm(rgw);
32 /// After running the algorithm, the original graph \c g
33 /// remains untouched. Thus the graph wrapper used above is to consider the
34 /// original graph with reverse orientation.
35 /// This techniques gives rise to an elegant code, and
36 /// based on stable graph wrappers, complex algorithms can be
37 /// implemented easily.
38 /// In flow, circulation and bipartite matching problems, the residual
39 /// graph is of particular importance. Combining a wrapper implementing
40 /// this, shortest path algorithms and minimum mean cycle algorithms,
41 /// a range of weighted and cardinality optimization algorithms can be
42 /// obtained. For lack of space, for other examples,
43 /// the interested user is referred to the detailed documentation of graph
45 /// The behavior of graph wrappers can be very different. Some of them keep
46 /// capabilities of the original graph while in other cases this would be
47 /// meaningless. This means that the concepts that they are a model of depend
48 /// on the graph wrapper, and the wrapped graph(s).
49 /// If an edge of \c rgw is deleted, this is carried out by
50 /// deleting the corresponding edge of \c g. But for a residual
51 /// graph, this operation has no sense.
52 /// Let we stand one more example here to simplify your work.
54 /// \code template<typename Graph> class RevGraphWrapper; \endcode
56 /// <tt> RevGraphWrapper(Graph& _g)</tt>.
57 /// This means that in a situation,
58 /// when a <tt> const ListGraph& </tt> reference to a graph is given,
59 /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
61 /// int algorithm1(const ListGraph& g) {
62 /// RevGraphWrapper<const ListGraph> rgw(g);
63 /// return algorithm2(rgw);
66 template<typename Graph>
72 typedef Graph BaseGraph;
73 typedef Graph ParentGraph;
75 // GraphWrapper() : graph(0) { }
76 GraphWrapper(Graph& _graph) : graph(&_graph) { }
77 // void setGraph(Graph& _graph) { graph=&_graph; }
78 // Graph& getGraph() const { return *graph; }
80 // typedef typename Graph::Node Node;
81 class Node : public Graph::Node {
82 friend class GraphWrapper<Graph>;
85 Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
86 Node(const Invalid& i) : Graph::Node(i) { }
89 friend class GraphWrapper<Graph>;
90 typename Graph::NodeIt n;
93 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
94 NodeIt(const Invalid& i) : n(i) { }
95 NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { }
96 operator Node() const { return Node(typename Graph::Node(n)); }
98 // typedef typename Graph::Edge Edge;
99 class Edge : public Graph::Edge {
100 friend class GraphWrapper<Graph>;
103 Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
104 Edge(const Invalid& i) : Graph::Edge(i) { }
107 friend class GraphWrapper<Graph>;
108 typename Graph::OutEdgeIt e;
111 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
112 OutEdgeIt(const Invalid& i) : e(i) { }
113 OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
114 e(*(_G.graph), typename Graph::Node(_n)) { }
115 operator Edge() const { return Edge(typename Graph::Edge(e)); }
118 friend class GraphWrapper<Graph>;
119 typename Graph::InEdgeIt e;
122 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
123 InEdgeIt(const Invalid& i) : e(i) { }
124 InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
125 e(*(_G.graph), typename Graph::Node(_n)) { }
126 operator Edge() const { return Edge(typename Graph::Edge(e)); }
128 //typedef typename Graph::SymEdgeIt SymEdgeIt;
130 friend class GraphWrapper<Graph>;
131 typename Graph::EdgeIt e;
134 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
135 EdgeIt(const Invalid& i) : e(i) { }
136 EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
137 operator Edge() const { return Edge(typename Graph::Edge(e)); }
140 NodeIt& first(NodeIt& i) const {
141 i=NodeIt(*this); return i;
143 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
144 i=OutEdgeIt(*this, p); return i;
146 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
147 i=InEdgeIt(*this, p); return i;
149 EdgeIt& first(EdgeIt& i) const {
150 i=EdgeIt(*this); return i;
153 NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
154 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
155 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
156 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
158 Node head(const Edge& e) const {
159 return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
160 Node tail(const Edge& e) const {
161 return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
163 bool valid(const Node& n) const {
164 return graph->valid(static_cast<typename Graph::Node>(n)); }
165 bool valid(const Edge& e) const {
166 return graph->valid(static_cast<typename Graph::Edge>(e)); }
168 int nodeNum() const { return graph->nodeNum(); }
169 int edgeNum() const { return graph->edgeNum(); }
171 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
172 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
173 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
174 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
176 Node addNode() const { return Node(graph->addNode()); }
177 Edge addEdge(const Node& tail, const Node& head) const {
178 return Edge(graph->addEdge(tail, head)); }
180 void erase(const Node& i) const { graph->erase(i); }
181 void erase(const Edge& i) const { graph->erase(i); }
183 void clear() const { graph->clear(); }
185 template<typename T> class NodeMap : public Graph::NodeMap<T> {
187 NodeMap(const GraphWrapper<Graph>& _G) :
188 Graph::NodeMap<T>(*(_G.graph)) { }
189 NodeMap(const GraphWrapper<Graph>& _G, T a) :
190 Graph::NodeMap<T>(*(_G.graph), a) { }
193 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
195 EdgeMap(const GraphWrapper<Graph>& _G) :
196 Graph::EdgeMap<T>(*(_G.graph)) { }
197 EdgeMap(const GraphWrapper<Graph>& _G, T a) :
198 Graph::EdgeMap<T>(*(_G.graph), a) { }
202 /// A graph wrapper which reverses the orientation of the edges.
204 /// A graph wrapper which reverses the orientation of the edges.
205 template<typename Graph>
206 class RevGraphWrapper : public GraphWrapper<Graph> {
209 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
211 typedef typename GraphWrapper<Graph>::Node Node;
212 typedef typename GraphWrapper<Graph>::Edge Edge;
213 //If Graph::OutEdgeIt is not defined
214 //and we do not want to use RevGraphWrapper::InEdgeIt,
215 //the typdef techinque does not work.
216 //Unfortunately all the typedefs are instantiated in templates.
217 //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
218 //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
221 friend class GraphWrapper<Graph>;
222 friend class RevGraphWrapper<Graph>;
223 typename Graph::OutEdgeIt e;
226 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
227 OutEdgeIt(const Invalid& i) : e(i) { }
228 OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
229 e(*(_G.graph), typename Graph::Node(_n)) { }
230 operator Edge() const { return Edge(typename Graph::Edge(e)); }
233 friend class GraphWrapper<Graph>;
234 friend class RevGraphWrapper<Graph>;
235 typename Graph::InEdgeIt e;
238 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
239 InEdgeIt(const Invalid& i) : e(i) { }
240 InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
241 e(*(_G.graph), typename Graph::Node(_n)) { }
242 operator Edge() const { return Edge(typename Graph::Edge(e)); }
245 using GraphWrapper<Graph>::first;
246 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
247 i=OutEdgeIt(*this, p); return i;
249 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
250 i=InEdgeIt(*this, p); return i;
253 using GraphWrapper<Graph>::next;
254 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
255 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
257 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
258 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
259 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
260 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
263 /// Wrapper for hiding nodes and edges from a graph.
265 /// This wrapper shows a graph with filtered node-set and
266 /// edge-set. The quick brown fox iterator jumps over
267 /// the lazy dog nodes or edges if the values for them are false
268 /// in the bool maps.
269 template<typename Graph, typename NodeFilterMap,
270 typename EdgeFilterMap>
271 class SubGraphWrapper : public GraphWrapper<Graph> {
273 NodeFilterMap* node_filter_map;
274 EdgeFilterMap* edge_filter_map;
277 SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
278 EdgeFilterMap& _edge_filter_map) :
279 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
280 edge_filter_map(&_edge_filter_map) { }
282 typedef typename GraphWrapper<Graph>::Node Node;
284 friend class GraphWrapper<Graph>;
285 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
286 typename Graph::NodeIt n;
289 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
290 NodeIt(const Invalid& i) : n(i) { }
291 NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
293 while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])
296 operator Node() const { return Node(typename Graph::Node(n)); }
298 typedef typename GraphWrapper<Graph>::Edge Edge;
300 friend class GraphWrapper<Graph>;
301 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
302 typename Graph::OutEdgeIt e;
305 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
306 OutEdgeIt(const Invalid& i) : e(i) { }
307 OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
309 e(*(_G.graph), typename Graph::Node(_n)) {
310 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
313 operator Edge() const { return Edge(typename Graph::Edge(e)); }
316 friend class GraphWrapper<Graph>;
317 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
318 typename Graph::InEdgeIt e;
321 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
322 InEdgeIt(const Invalid& i) : e(i) { }
323 InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
325 e(*(_G.graph), typename Graph::Node(_n)) {
326 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
329 operator Edge() const { return Edge(typename Graph::Edge(e)); }
331 //typedef typename Graph::SymEdgeIt SymEdgeIt;
333 friend class GraphWrapper<Graph>;
334 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
335 typename Graph::EdgeIt e;
338 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
339 EdgeIt(const Invalid& i) : e(i) { }
340 EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
342 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
345 operator Edge() const { return Edge(typename Graph::Edge(e)); }
348 NodeIt& first(NodeIt& i) const {
349 i=NodeIt(*this); return i;
351 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
352 i=OutEdgeIt(*this, p); return i;
354 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
355 i=InEdgeIt(*this, p); return i;
357 EdgeIt& first(EdgeIt& i) const {
358 i=EdgeIt(*this); return i;
361 NodeIt& next(NodeIt& i) const {
363 while (graph->valid(i) && !(*node_filter_map)[i.n]) { graph->next(i.n); }
366 OutEdgeIt& next(OutEdgeIt& i) const {
368 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
371 InEdgeIt& next(InEdgeIt& i) const {
373 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
376 EdgeIt& next(EdgeIt& i) const {
378 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
382 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
383 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
384 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
385 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
388 ///Some doki, please.
389 void hide(const Node& n) const { node_filter_map->set(n, false); }
391 ///Some doki, please.
392 void hide(const Edge& e) const { edge_filter_map->set(e, false); }
395 ///Some doki, please.
396 void unHide(const Node& n) const { node_filter_map->set(n, true); }
398 ///Some doki, please.
399 void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
402 ///Some doki, please.
403 bool hidden(const Node& n) const { return (*node_filter_map)[n]; }
405 ///Some doki, please.
406 bool hidden(const Edge& e) const { return (*edge_filter_map)[e]; }
409 /// A wrapper for forgetting the orientation of a graph.
411 /// A wrapper for getting an undirected graph by forgetting
412 /// the orientation of a directed one.
413 template<typename Graph>
414 class UndirGraphWrapper : public GraphWrapper<Graph> {
416 typedef typename GraphWrapper<Graph>::Node Node;
417 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
418 typedef typename GraphWrapper<Graph>::Edge Edge;
419 typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
421 UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
424 friend class UndirGraphWrapper<Graph>;
425 bool out_or_in; //true iff out
426 typename Graph::OutEdgeIt out;
427 typename Graph::InEdgeIt in;
430 OutEdgeIt(const Invalid& i) : Edge(i) { }
431 OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
432 out_or_in=true; _G.graph->first(out, _n);
433 if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n); }
435 operator Edge() const {
436 if (out_or_in) return Edge(out); else return Edge(in);
441 typedef OutEdgeIt InEdgeIt;
443 using GraphWrapper<Graph>::first;
444 // NodeIt& first(NodeIt& i) const {
445 // i=NodeIt(*this); return i;
447 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
448 i=OutEdgeIt(*this, p); return i;
451 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
452 // i=InEdgeIt(*this, p); return i;
454 // EdgeIt& first(EdgeIt& i) const {
455 // i=EdgeIt(*this); return i;
458 using GraphWrapper<Graph>::next;
459 // NodeIt& next(NodeIt& n) const {
460 // GraphWrapper<Graph>::next(n);
463 OutEdgeIt& next(OutEdgeIt& e) const {
465 typename Graph::Node n=graph->tail(e.out);
467 if (!graph->valid(e.out)) { e.out_or_in=false; graph->first(e.in, n); }
474 // EdgeIt& next(EdgeIt& e) const {
475 // GraphWrapper<Graph>::next(n);
476 // // graph->next(e.e);
480 Node aNode(const OutEdgeIt& e) const {
481 if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
482 Node bNode(const OutEdgeIt& e) const {
483 if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
486 /// A wrapper for composing the residual graph for directed flow and circulation problems.
488 /// A wrapper for composing the residual graph for directed flow and circulation problems.
489 template<typename Graph, typename Number,
490 typename CapacityMap, typename FlowMap>
491 class ResGraphWrapper : public GraphWrapper<Graph> {
493 const CapacityMap* capacity;
497 ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
499 GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
504 friend class OutEdgeIt;
506 typedef typename GraphWrapper<Graph>::Node Node;
507 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
508 class Edge : public Graph::Edge {
509 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
511 bool forward; //true, iff forward
512 // typename Graph::Edge e;
515 Edge(const typename Graph::Edge& _e, bool _forward) :
516 Graph::Edge(_e), forward(_forward) { }
517 Edge(const Invalid& i) : Graph::Edge(i), forward(false) { }
518 //the unique invalid iterator
519 friend bool operator==(const Edge& u, const Edge& v) {
520 return (v.forward==u.forward &&
521 static_cast<typename Graph::Edge>(u)==
522 static_cast<typename Graph::Edge>(v));
524 friend bool operator!=(const Edge& u, const Edge& v) {
525 return (v.forward!=u.forward ||
526 static_cast<typename Graph::Edge>(u)!=
527 static_cast<typename Graph::Edge>(v));
532 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
534 typename Graph::OutEdgeIt out;
535 typename Graph::InEdgeIt in;
540 // OutEdgeIt(const Edge& e) : Edge(e) { }
541 OutEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
542 //the unique invalid iterator
543 OutEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
545 resG.graph->first(out, v);
546 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
547 if (!resG.graph->valid(out)) {
549 resG.graph->first(in, v);
550 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
553 operator Edge() const {
555 // e.forward=this->forward;
556 // if (this->forward) e=out; else e=in;
559 return Edge(out, this->forward);
561 return Edge(in, this->forward);
566 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
568 typename Graph::OutEdgeIt out;
569 typename Graph::InEdgeIt in;
574 // OutEdgeIt(const Edge& e) : Edge(e) { }
575 InEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
576 //the unique invalid iterator
577 InEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
579 resG.graph->first(in, v);
580 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
581 if (!resG.graph->valid(in)) {
583 resG.graph->first(out, v);
584 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
587 operator Edge() const {
589 // e.forward=this->forward;
590 // if (this->forward) e=out; else e=in;
593 return Edge(in, this->forward);
595 return Edge(out, this->forward);
600 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
602 typename Graph::EdgeIt e;
606 EdgeIt(const Invalid& i) : e(i), forward(false) { }
607 EdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG) {
609 resG.graph->first(e);
610 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
611 if (!resG.graph->valid(e)) {
613 resG.graph->first(e);
614 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
617 operator Edge() const {
618 return Edge(e, this->forward);
622 using GraphWrapper<Graph>::first;
623 // NodeIt& first(NodeIt& i) const {
624 // i=NodeIt(*this); return i;
626 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
627 i=OutEdgeIt(*this, p); return i;
630 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
631 i=InEdgeIt(*this, p); return i;
633 EdgeIt& first(EdgeIt& i) const {
634 i=EdgeIt(*this); return i;
637 using GraphWrapper<Graph>::next;
638 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
639 OutEdgeIt& next(OutEdgeIt& e) const {
641 Node v=graph->aNode(e.out);
643 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
644 if (!graph->valid(e.out)) {
646 graph->first(e.in, v);
647 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
651 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
656 InEdgeIt& next(InEdgeIt& e) const {
658 Node v=graph->aNode(e.in);
660 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
661 if (!graph->valid(e.in)) {
663 graph->first(e.out, v);
664 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
668 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
672 EdgeIt& next(EdgeIt& e) const {
675 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
676 if (!graph->valid(e.e)) {
679 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
683 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
688 Node tail(Edge e) const {
689 return ((e.forward) ? graph->tail(e) : graph->head(e)); }
690 Node head(Edge e) const {
691 return ((e.forward) ? graph->head(e) : graph->tail(e)); }
693 Node aNode(OutEdgeIt e) const {
694 return ((e.forward) ? graph->aNode(e.out) : graph->aNode(e.in)); }
695 Node bNode(OutEdgeIt e) const {
696 return ((e.forward) ? graph->bNode(e.out) : graph->bNode(e.in)); }
698 // int nodeNum() const { return graph->nodeNum(); }
700 void edgeNum() const { }
701 //int edgeNum() const { return graph->edgeNum(); }
704 // int id(Node v) const { return graph->id(v); }
706 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
707 bool valid(Edge e) const {
708 return graph->valid(e);
709 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
712 void augment(const Edge& e, Number a) const {
714 // flow->set(e.out, flow->get(e.out)+a);
715 flow->set(e, (*flow)[e]+a);
717 // flow->set(e.in, flow->get(e.in)-a);
718 flow->set(e, (*flow)[e]-a);
721 Number resCap(const Edge& e) const {
723 // return (capacity->get(e.out)-flow->get(e.out));
724 return ((*capacity)[e]-(*flow)[e]);
726 // return (flow->get(e.in));
730 // Number resCap(typename Graph::OutEdgeIt out) const {
731 // // return (capacity->get(out)-flow->get(out));
732 // return ((*capacity)[out]-(*flow)[out]);
735 // Number resCap(typename Graph::InEdgeIt in) const {
736 // // return (flow->get(in));
737 // return ((*flow)[in]);
740 template <typename T>
742 typename Graph::EdgeMap<T> forward_map, backward_map;
744 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
745 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
746 void set(Edge e, T a) {
748 forward_map.set(e.out, a);
750 backward_map.set(e.in, a);
752 T operator[](Edge e) const {
754 return forward_map[e.out];
756 return backward_map[e.in];
758 // T get(Edge e) const {
760 // return forward_map.get(e.out);
762 // return backward_map.get(e.in);
767 /// ErasingFirstGraphWrapper for blocking flows.
769 /// ErasingFirstGraphWrapper for blocking flows.
770 template<typename Graph, typename FirstOutEdgesMap>
771 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
773 FirstOutEdgesMap* first_out_edges;
775 ErasingFirstGraphWrapper(Graph& _graph,
776 FirstOutEdgesMap& _first_out_edges) :
777 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
779 typedef typename GraphWrapper<Graph>::Node Node;
781 // friend class GraphWrapper<Graph>;
782 // friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
783 // typename Graph::NodeIt n;
786 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
787 // NodeIt(const Invalid& i) : n(i) { }
788 // NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
789 // n(*(_G.graph)) { }
790 // operator Node() const { return Node(typename Graph::Node(n)); }
792 typedef typename GraphWrapper<Graph>::Edge Edge;
794 friend class GraphWrapper<Graph>;
795 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
796 // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
797 typename Graph::OutEdgeIt e;
800 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
801 OutEdgeIt(const Invalid& i) : e(i) { }
802 OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
804 e((*_G.first_out_edges)[_n]) { }
805 operator Edge() const { return Edge(typename Graph::Edge(e)); }
808 friend class GraphWrapper<Graph>;
809 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
810 // typedef typename Graph::InEdgeIt GraphInEdgeIt;
811 typename Graph::InEdgeIt e;
814 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
815 InEdgeIt(const Invalid& i) : e(i) { }
816 InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
818 e(*(_G.graph), typename Graph::Node(_n)) { }
819 operator Edge() const { return Edge(typename Graph::Edge(e)); }
821 //typedef typename Graph::SymEdgeIt SymEdgeIt;
823 friend class GraphWrapper<Graph>;
824 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
825 // typedef typename Graph::EdgeIt GraphEdgeIt;
826 typename Graph::EdgeIt e;
829 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
830 EdgeIt(const Invalid& i) : e(i) { }
831 EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
833 operator Edge() const { return Edge(typename Graph::Edge(e)); }
836 using GraphWrapper<Graph>::first;
837 // NodeIt& first(NodeIt& i) const {
838 // i=NodeIt(*this); return i;
840 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
841 i=OutEdgeIt(*this, p); return i;
843 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
844 i=InEdgeIt(*this, p); return i;
846 EdgeIt& first(EdgeIt& i) const {
847 i=EdgeIt(*this); return i;
850 using GraphWrapper<Graph>::next;
851 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
852 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
853 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
854 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
856 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
857 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
858 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
859 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
861 void erase(const OutEdgeIt& e) const {
864 first_out_edges->set(this->tail(e), f.e);
870 // /// experimentral, do not try it.
871 // template<typename Graph>
872 // class stGraphWrapper : public GraphWrapper<Graph> {
884 // stGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph),
885 // s(INVALID, 1), t(INVALID, 2) { }
887 // class Node : public Graph::Node {
888 // friend class GraphWrapper<Graph>;
889 // friend class stGraphWrapper<Graph>;
891 // int spec; //0 if real node, 1 iff s, 2 iff t
894 // Node(const typename Graph::Node& _n, int _spec=0) :
895 // Graph::Node(_n), spec(_spec) { }
896 // Node(const Invalid& i) : Graph::Node(i), spec(2) { }
897 // //invalid: (invalid, 2);
901 // friend class GraphWrapper<Graph>;
902 // friend class stGraphWrapper<Graph>;
903 // typename Graph::NodeIt n;
907 // NodeIt(const typename Graph::NodeIt& _n, int _spec=0) :
908 // n(_n), spec(_spec) { }
909 // NodeIt(const Invalid& i) : n(i), spec(2) { }
910 // NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)), spec(0) {
911 // if (!_G->valid(n)) spec=1;
913 // operator Node() const { return Node(n, spec); }
915 // // typedef typename Graph::Edge Edge;
916 // class Edge : public Graph::Edge {
917 // friend class GraphWrapper<Graph>;
918 // friend class stGraphWrapper<Graph>;
923 // Edge(const typename Graph::Edge& _e) :
924 // Graph::Edge(_e), tail_spec(i, 0), head_spec(i, 0) {
925 // //a tail-t es a head-et real node-ra csinaljuk
927 // Edge(const Invalid& i) : Graph::Edge(i), tail_spec(i), head_spec(i) { }
930 // friend class GraphWrapper<Graph>;
931 // friend class stGraphWrapper<Graph>;
932 // typename Graph::OutEdgeIt e;
937 // OutEdgeIt(const typename Graph::OutEdgeIt& _e) :
938 // e(_e), tail_spec(i, 0), head_spec(i, 0) {
939 // //a tail-t es a head-et real node-ra csinaljuk
941 // OutEdgeIt(const Invalid& i) : e(i), tail_spec(i), head_spec(i) { }
942 // //invalid: (barmi, 0, 2)
943 // OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) {
944 // switch (_n.spec) {
946 // e=typename Graph::OutEdgeIt(*(_G.graph), typename Graph::Node(_n));
949 // if (!_G.graph->valid(e)) spec=1;
954 // _head(_G.graph->first(typename Graph::NodeIt()));
960 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
963 // friend class GraphWrapper<Graph>;
964 // typename Graph::InEdgeIt e;
967 // InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
968 // InEdgeIt(const Invalid& i) : e(i) { }
969 // InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
970 // e(*(_G.graph), typename Graph::Node(_n)) { }
971 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
973 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
975 // friend class GraphWrapper<Graph>;
976 // typename Graph::EdgeIt e;
979 // EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
980 // EdgeIt(const Invalid& i) : e(i) { }
981 // EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
982 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
985 // NodeIt& first(NodeIt& i) const {
986 // i=NodeIt(*this); return i;
988 // OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
989 // i=OutEdgeIt(*this, p); return i;
991 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
992 // i=InEdgeIt(*this, p); return i;
994 // EdgeIt& first(EdgeIt& i) const {
995 // i=EdgeIt(*this); return i;
998 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
999 // OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
1000 // InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
1001 // EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
1003 // Node head(const Edge& e) const {
1004 // return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
1005 // Node tail(const Edge& e) const {
1006 // return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
1008 // bool valid(const Node& n) const {
1009 // return graph->valid(static_cast<typename Graph::Node>(n)); }
1010 // bool valid(const Edge& e) const {
1011 // return graph->valid(static_cast<typename Graph::Edge>(e)); }
1013 // int nodeNum() const { return graph->nodeNum(); }
1014 // int edgeNum() const { return graph->edgeNum(); }
1016 // Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
1017 // Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
1018 // Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
1019 // Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
1021 // Node addNode() const { return Node(graph->addNode()); }
1022 // Edge addEdge(const Node& tail, const Node& head) const {
1023 // return Edge(graph->addEdge(tail, head)); }
1025 // void erase(const Node& i) const { graph->erase(i); }
1026 // void erase(const Edge& i) const { graph->erase(i); }
1028 // void clear() const { graph->clear(); }
1030 // template<typename T> class NodeMap : public Graph::NodeMap<T> {
1032 // NodeMap(const GraphWrapper<Graph>& _G) :
1033 // Graph::NodeMap<T>(*(_G.graph)) { }
1034 // NodeMap(const GraphWrapper<Graph>& _G, T a) :
1035 // Graph::NodeMap<T>(*(_G.graph), a) { }
1038 // template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1040 // EdgeMap(const GraphWrapper<Graph>& _G) :
1041 // Graph::EdgeMap<T>(*(_G.graph)) { }
1042 // EdgeMap(const GraphWrapper<Graph>& _G, T a) :
1043 // Graph::EdgeMap<T>(*(_G.graph), a) { }
1049 #endif //HUGO_GRAPH_WRAPPER_H