2 #ifndef HUGO_GRAPH_WRAPPER_H
3 #define HUGO_GRAPH_WRAPPER_H
12 /// A main parts of HUGOlib are the different graph structures,
13 /// generic graph algorithms, graph concepts which couple these, and
14 /// graph wrappers. While the previous ones are more or less clear, the
15 /// latter notion needs further explanation.
16 /// Graph wrappers are graph classes which serve for considering graph
17 /// structures in different ways. A short example makes the notion much
19 /// Suppose that we have an instance \c g of a directed graph
20 /// type say \c ListGraph and an algorithm
21 /// \code template<typename Graph> int algorithm(const Graph&); \endcode
22 /// is needed to run on the reversely oriented graph.
23 /// It may be expensive (in time or in memory usage) to copy
24 /// \c g with the reverse orientation.
25 /// Thus, a wrapper class
26 /// \code template<typename Graph> class RevGraphWrapper; \endcode is used.
27 /// The code looks as follows
30 /// RevGraphWrapper<ListGraph> rgw(g);
31 /// int result=algorithm(rgw);
33 /// After running the algorithm, the original graph \c g
34 /// remains untouched. Thus the graph wrapper used above is to consider the
35 /// original graph with reverse orientation.
36 /// This techniques gives rise to an elegant code, and
37 /// based on stable graph wrappers, complex algorithms can be
38 /// implemented easily.
39 /// In flow, circulation and bipartite matching problems, the residual
40 /// graph is of particular importance. Combining a wrapper implementing
41 /// this, shortest path algorithms and minimum mean cycle algorithms,
42 /// a range of weighted and cardinality optimization algorithms can be
43 /// obtained. For lack of space, for other examples,
44 /// the interested user is referred to the detailed documentation of graph
46 /// The behavior of graph wrappers can be very different. Some of them keep
47 /// capabilities of the original graph while in other cases this would be
48 /// meaningless. This means that the concepts that they are a model of depend
49 /// on the graph wrapper, and the wrapped graph(s).
50 /// If an edge of \c rgw is deleted, this is carried out by
51 /// deleting the corresponding edge of \c g. But for a residual
52 /// graph, this operation has no sense.
53 /// Let we stand one more example here to simplify your work.
55 /// \code template<typename Graph> class RevGraphWrapper; \endcode
57 /// <tt> RevGraphWrapper(Graph& _g)</tt>.
58 /// This means that in a situation,
59 /// when a <tt> const ListGraph& </tt> reference to a graph is given,
60 /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
62 /// int algorithm1(const ListGraph& g) {
63 /// RevGraphWrapper<const ListGraph> rgw(g);
64 /// return algorithm2(rgw);
67 template<typename Graph>
73 typedef Graph BaseGraph;
74 typedef Graph ParentGraph;
76 // GraphWrapper() : graph(0) { }
77 GraphWrapper(Graph& _graph) : graph(&_graph) { }
78 // void setGraph(Graph& _graph) { graph=&_graph; }
79 // Graph& getGraph() const { return *graph; }
81 // typedef typename Graph::Node Node;
82 class Node : public Graph::Node {
83 friend class GraphWrapper<Graph>;
86 Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
87 Node(const Invalid& i) : Graph::Node(i) { }
90 friend class GraphWrapper<Graph>;
91 typename Graph::NodeIt n;
94 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
95 NodeIt(const Invalid& i) : n(i) { }
96 NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { }
97 operator Node() const { return Node(typename Graph::Node(n)); }
99 // typedef typename Graph::Edge Edge;
100 class Edge : public Graph::Edge {
101 friend class GraphWrapper<Graph>;
104 Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
105 Edge(const Invalid& i) : Graph::Edge(i) { }
108 friend class GraphWrapper<Graph>;
109 typename Graph::OutEdgeIt e;
112 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
113 OutEdgeIt(const Invalid& i) : e(i) { }
114 OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
115 e(*(_G.graph), typename Graph::Node(_n)) { }
116 operator Edge() const { return Edge(typename Graph::Edge(e)); }
119 friend class GraphWrapper<Graph>;
120 typename Graph::InEdgeIt e;
123 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
124 InEdgeIt(const Invalid& i) : e(i) { }
125 InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
126 e(*(_G.graph), typename Graph::Node(_n)) { }
127 operator Edge() const { return Edge(typename Graph::Edge(e)); }
129 //typedef typename Graph::SymEdgeIt SymEdgeIt;
131 friend class GraphWrapper<Graph>;
132 typename Graph::EdgeIt e;
135 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
136 EdgeIt(const Invalid& i) : e(i) { }
137 EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
138 operator Edge() const { return Edge(typename Graph::Edge(e)); }
141 NodeIt& first(NodeIt& i) const {
142 i=NodeIt(*this); return i;
144 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
145 i=OutEdgeIt(*this, p); return i;
147 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
148 i=InEdgeIt(*this, p); return i;
150 EdgeIt& first(EdgeIt& i) const {
151 i=EdgeIt(*this); return i;
154 NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
155 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
156 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
157 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
159 Node tail(const Edge& e) const {
160 return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
161 Node head(const Edge& e) const {
162 return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
164 bool valid(const Node& n) const {
165 return graph->valid(static_cast<typename Graph::Node>(n)); }
166 bool valid(const Edge& e) const {
167 return graph->valid(static_cast<typename Graph::Edge>(e)); }
169 int nodeNum() const { return graph->nodeNum(); }
170 int edgeNum() const { return graph->edgeNum(); }
172 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
173 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
174 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
175 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
177 Node addNode() const { return Node(graph->addNode()); }
178 Edge addEdge(const Node& tail, const Node& head) const {
179 return Edge(graph->addEdge(tail, head)); }
181 void erase(const Node& i) const { graph->erase(i); }
182 void erase(const Edge& i) const { graph->erase(i); }
184 void clear() const { graph->clear(); }
186 template<typename T> class NodeMap : public Graph::template NodeMap<T> {
187 typedef typename Graph::template NodeMap<T> Parent;
189 NodeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
190 NodeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
193 template<typename T> class EdgeMap : public Graph::template EdgeMap<T> {
194 typedef typename Graph::template EdgeMap<T> Parent;
196 EdgeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
197 EdgeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
201 /// A graph wrapper which reverses the orientation of the edges.
203 /// A graph wrapper which reverses the orientation of the edges.
204 template<typename Graph>
205 class RevGraphWrapper : public GraphWrapper<Graph> {
208 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
210 typedef typename GraphWrapper<Graph>::Node Node;
211 typedef typename GraphWrapper<Graph>::Edge Edge;
212 //If Graph::OutEdgeIt is not defined
213 //and we do not want to use RevGraphWrapper::InEdgeIt,
214 //the typdef techinque does not work.
215 //Unfortunately all the typedefs are instantiated in templates.
216 //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
217 //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
220 friend class GraphWrapper<Graph>;
221 friend class RevGraphWrapper<Graph>;
222 typename Graph::InEdgeIt e;
225 OutEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
226 OutEdgeIt(const Invalid& i) : e(i) { }
227 OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
228 e(*(_G.graph), typename Graph::Node(_n)) { }
229 operator Edge() const { return Edge(typename Graph::Edge(e)); }
232 friend class GraphWrapper<Graph>;
233 friend class RevGraphWrapper<Graph>;
234 typename Graph::OutEdgeIt e;
237 InEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
238 InEdgeIt(const Invalid& i) : e(i) { }
239 InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
240 e(*(_G.graph), typename Graph::Node(_n)) { }
241 operator Edge() const { return Edge(typename Graph::Edge(e)); }
244 using GraphWrapper<Graph>::first;
245 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
246 i=OutEdgeIt(*this, p); return i;
248 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
249 i=InEdgeIt(*this, p); return i;
252 using GraphWrapper<Graph>::next;
253 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
254 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
256 Node aNode(const OutEdgeIt& e) const {
257 return Node(this->graph->aNode(e.e)); }
258 Node aNode(const InEdgeIt& e) const {
259 return Node(this->graph->aNode(e.e)); }
260 Node bNode(const OutEdgeIt& e) const {
261 return Node(this->graph->bNode(e.e)); }
262 Node bNode(const InEdgeIt& e) const {
263 return Node(this->graph->bNode(e.e)); }
265 Node tail(const Edge& e) const {
266 return GraphWrapper<Graph>::head(e); }
267 Node head(const Edge& e) const {
268 return GraphWrapper<Graph>::tail(e); }
272 /// Wrapper for hiding nodes and edges from a graph.
274 /// This wrapper shows a graph with filtered node-set and
275 /// edge-set. The quick brown fox iterator jumps over
276 /// the lazy dog nodes or edges if the values for them are false
277 /// in the bool maps.
278 template<typename Graph, typename NodeFilterMap,
279 typename EdgeFilterMap>
280 class SubGraphWrapper : public GraphWrapper<Graph> {
282 NodeFilterMap* node_filter_map;
283 EdgeFilterMap* edge_filter_map;
286 SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
287 EdgeFilterMap& _edge_filter_map) :
288 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
289 edge_filter_map(&_edge_filter_map) { }
291 typedef typename GraphWrapper<Graph>::Node Node;
293 friend class GraphWrapper<Graph>;
294 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
295 typename Graph::NodeIt n;
298 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
299 NodeIt(const Invalid& i) : n(i) { }
300 NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
302 while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])
305 operator Node() const { return Node(typename Graph::Node(n)); }
307 typedef typename GraphWrapper<Graph>::Edge Edge;
309 friend class GraphWrapper<Graph>;
310 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
311 typename Graph::OutEdgeIt e;
314 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
315 OutEdgeIt(const Invalid& i) : e(i) { }
316 OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
318 e(*(_G.graph), typename Graph::Node(_n)) {
319 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
322 operator Edge() const { return Edge(typename Graph::Edge(e)); }
325 friend class GraphWrapper<Graph>;
326 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
327 typename Graph::InEdgeIt e;
330 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
331 InEdgeIt(const Invalid& i) : e(i) { }
332 InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
334 e(*(_G.graph), typename Graph::Node(_n)) {
335 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
338 operator Edge() const { return Edge(typename Graph::Edge(e)); }
340 //typedef typename Graph::SymEdgeIt SymEdgeIt;
342 friend class GraphWrapper<Graph>;
343 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
344 typename Graph::EdgeIt e;
347 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
348 EdgeIt(const Invalid& i) : e(i) { }
349 EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
351 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
354 operator Edge() const { return Edge(typename Graph::Edge(e)); }
357 NodeIt& first(NodeIt& i) const {
358 i=NodeIt(*this); return i;
360 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
361 i=OutEdgeIt(*this, p); return i;
363 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
364 i=InEdgeIt(*this, p); return i;
366 EdgeIt& first(EdgeIt& i) const {
367 i=EdgeIt(*this); return i;
370 NodeIt& next(NodeIt& i) const {
371 this->graph->next(i.n);
372 while (this->graph->valid(i) && !(*node_filter_map)[i.n]) {
373 this->graph->next(i.n); }
376 OutEdgeIt& next(OutEdgeIt& i) const {
377 this->graph->next(i.e);
378 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
379 this->graph->next(i.e); }
382 InEdgeIt& next(InEdgeIt& i) const {
383 this->graph->next(i.e);
384 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
385 this->graph->next(i.e); }
388 EdgeIt& next(EdgeIt& i) const {
389 this->graph->next(i.e);
390 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
391 this->graph->next(i.e); }
395 Node aNode(const OutEdgeIt& e) const {
396 return Node(this->graph->aNode(e.e)); }
397 Node aNode(const InEdgeIt& e) const {
398 return Node(this->graph->aNode(e.e)); }
399 Node bNode(const OutEdgeIt& e) const {
400 return Node(this->graph->bNode(e.e)); }
401 Node bNode(const InEdgeIt& e) const {
402 return Node(this->graph->bNode(e.e)); }
405 ///Some doki, please.
406 void hide(const Node& n) const { node_filter_map->set(n, false); }
408 ///Some doki, please.
409 void hide(const Edge& e) const { edge_filter_map->set(e, false); }
412 ///Some doki, please.
413 void unHide(const Node& n) const { node_filter_map->set(n, true); }
415 ///Some doki, please.
416 void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
419 ///Some doki, please.
420 bool hidden(const Node& n) const { return (*node_filter_map)[n]; }
422 ///Some doki, please.
423 bool hidden(const Edge& e) const { return (*edge_filter_map)[e]; }
426 /// A wrapper for forgetting the orientation of a graph.
428 /// A wrapper for getting an undirected graph by forgetting
429 /// the orientation of a directed one.
430 template<typename Graph>
431 class UndirGraphWrapper : public GraphWrapper<Graph> {
433 typedef typename GraphWrapper<Graph>::Node Node;
434 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
435 typedef typename GraphWrapper<Graph>::Edge Edge;
436 typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
438 UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
441 friend class UndirGraphWrapper<Graph>;
442 bool out_or_in; //true iff out
443 typename Graph::OutEdgeIt out;
444 typename Graph::InEdgeIt in;
447 OutEdgeIt(const Invalid& i) : Edge(i) { }
448 OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
449 out_or_in=true; _G.graph->first(out, _n);
450 if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n); }
452 operator Edge() const {
453 if (out_or_in) return Edge(out); else return Edge(in);
458 typedef OutEdgeIt InEdgeIt;
460 using GraphWrapper<Graph>::first;
461 // NodeIt& first(NodeIt& i) const {
462 // i=NodeIt(*this); return i;
464 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
465 i=OutEdgeIt(*this, p); return i;
468 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
469 // i=InEdgeIt(*this, p); return i;
471 // EdgeIt& first(EdgeIt& i) const {
472 // i=EdgeIt(*this); return i;
475 using GraphWrapper<Graph>::next;
476 // NodeIt& next(NodeIt& n) const {
477 // GraphWrapper<Graph>::next(n);
480 OutEdgeIt& next(OutEdgeIt& e) const {
482 typename Graph::Node n=this->graph->tail(e.out);
483 this->graph->next(e.out);
484 if (!this->graph->valid(e.out)) {
485 e.out_or_in=false; this->graph->first(e.in, n); }
487 this->graph->next(e.in);
492 // EdgeIt& next(EdgeIt& e) const {
493 // GraphWrapper<Graph>::next(n);
494 // // graph->next(e.e);
498 Node aNode(const OutEdgeIt& e) const {
499 if (e.out_or_in) return this->graph->tail(e); else
500 return this->graph->head(e); }
501 Node bNode(const OutEdgeIt& e) const {
502 if (e.out_or_in) return this->graph->head(e); else
503 return this->graph->tail(e); }
506 /// A wrapper for composing the residual graph for directed flow and circulation problems.
508 /// A wrapper for composing the residual graph for directed flow and circulation problems.
509 template<typename Graph, typename Number,
510 typename CapacityMap, typename FlowMap>
511 class ResGraphWrapper : public GraphWrapper<Graph> {
513 const CapacityMap* capacity;
517 ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
519 GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
524 friend class OutEdgeIt;
526 typedef typename GraphWrapper<Graph>::Node Node;
527 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
528 class Edge : public Graph::Edge {
529 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
531 bool forward; //true, iff forward
532 // typename Graph::Edge e;
535 Edge(const typename Graph::Edge& _e, bool _forward) :
536 Graph::Edge(_e), forward(_forward) { }
537 Edge(const Invalid& i) : Graph::Edge(i), forward(false) { }
538 //the unique invalid iterator
539 friend bool operator==(const Edge& u, const Edge& v) {
540 return (v.forward==u.forward &&
541 static_cast<typename Graph::Edge>(u)==
542 static_cast<typename Graph::Edge>(v));
544 friend bool operator!=(const Edge& u, const Edge& v) {
545 return (v.forward!=u.forward ||
546 static_cast<typename Graph::Edge>(u)!=
547 static_cast<typename Graph::Edge>(v));
552 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
554 typename Graph::OutEdgeIt out;
555 typename Graph::InEdgeIt in;
560 // OutEdgeIt(const Edge& e) : Edge(e) { }
561 OutEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
562 //the unique invalid iterator
563 OutEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
565 resG.graph->first(out, v);
566 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
567 if (!resG.graph->valid(out)) {
569 resG.graph->first(in, v);
570 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
573 operator Edge() const {
575 // e.forward=this->forward;
576 // if (this->forward) e=out; else e=in;
579 return Edge(out, this->forward);
581 return Edge(in, this->forward);
586 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
588 typename Graph::OutEdgeIt out;
589 typename Graph::InEdgeIt in;
594 // OutEdgeIt(const Edge& e) : Edge(e) { }
595 InEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
596 //the unique invalid iterator
597 InEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
599 resG.graph->first(in, v);
600 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
601 if (!resG.graph->valid(in)) {
603 resG.graph->first(out, v);
604 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
607 operator Edge() const {
609 // e.forward=this->forward;
610 // if (this->forward) e=out; else e=in;
613 return Edge(in, this->forward);
615 return Edge(out, this->forward);
620 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
622 typename Graph::EdgeIt e;
626 EdgeIt(const Invalid& i) : e(i), forward(false) { }
627 EdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG) {
629 resG.graph->first(e);
630 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
631 if (!resG.graph->valid(e)) {
633 resG.graph->first(e);
634 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
637 operator Edge() const {
638 return Edge(e, this->forward);
642 using GraphWrapper<Graph>::first;
643 // NodeIt& first(NodeIt& i) const {
644 // i=NodeIt(*this); return i;
646 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
647 i=OutEdgeIt(*this, p); return i;
650 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
651 i=InEdgeIt(*this, p); return i;
653 EdgeIt& first(EdgeIt& i) const {
654 i=EdgeIt(*this); return i;
657 using GraphWrapper<Graph>::next;
658 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
659 OutEdgeIt& next(OutEdgeIt& e) const {
661 Node v=this->graph->aNode(e.out);
662 this->graph->next(e.out);
663 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
664 this->graph->next(e.out); }
665 if (!this->graph->valid(e.out)) {
667 this->graph->first(e.in, v);
668 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
669 this->graph->next(e.in); }
672 this->graph->next(e.in);
673 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
674 this->graph->next(e.in); }
679 InEdgeIt& next(InEdgeIt& e) const {
681 Node v=this->graph->aNode(e.in);
682 this->graph->next(e.in);
683 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
684 this->graph->next(e.in); }
685 if (!this->graph->valid(e.in)) {
687 this->graph->first(e.out, v);
688 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
689 this->graph->next(e.out); }
692 this->graph->next(e.out);
693 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
694 this->graph->next(e.out); }
698 EdgeIt& next(EdgeIt& e) const {
700 this->graph->next(e.e);
701 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
702 this->graph->next(e.e); }
703 if (!this->graph->valid(e.e)) {
705 this->graph->first(e.e);
706 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
707 this->graph->next(e.e); }
710 this->graph->next(e.e);
711 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
712 this->graph->next(e.e); }
717 Node tail(Edge e) const {
718 return ((e.forward) ? this->graph->tail(e) : this->graph->head(e)); }
719 Node head(Edge e) const {
720 return ((e.forward) ? this->graph->head(e) : this->graph->tail(e)); }
722 Node aNode(OutEdgeIt e) const {
723 return ((e.forward) ? this->graph->aNode(e.out) :
724 this->graph->aNode(e.in)); }
725 Node bNode(OutEdgeIt e) const {
726 return ((e.forward) ? this->graph->bNode(e.out) :
727 this->graph->bNode(e.in)); }
729 Node aNode(InEdgeIt e) const {
730 return ((e.forward) ? this->graph->aNode(e.in) :
731 this->graph->aNode(e.out)); }
732 Node bNode(InEdgeIt e) const {
733 return ((e.forward) ? this->graph->bNode(e.in) :
734 this->graph->bNode(e.out)); }
736 // int nodeNum() const { return graph->nodeNum(); }
738 void edgeNum() const { }
739 //int edgeNum() const { return graph->edgeNum(); }
742 // int id(Node v) const { return graph->id(v); }
744 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
745 bool valid(Edge e) const {
746 return this->graph->valid(e);
747 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
750 void augment(const Edge& e, Number a) const {
752 // flow->set(e.out, flow->get(e.out)+a);
753 flow->set(e, (*flow)[e]+a);
755 // flow->set(e.in, flow->get(e.in)-a);
756 flow->set(e, (*flow)[e]-a);
759 Number resCap(const Edge& e) const {
761 // return (capacity->get(e.out)-flow->get(e.out));
762 return ((*capacity)[e]-(*flow)[e]);
764 // return (flow->get(e.in));
768 // Number resCap(typename Graph::OutEdgeIt out) const {
769 // // return (capacity->get(out)-flow->get(out));
770 // return ((*capacity)[out]-(*flow)[out]);
773 // Number resCap(typename Graph::InEdgeIt in) const {
774 // // return (flow->get(in));
775 // return ((*flow)[in]);
778 template <typename T>
780 typename Graph::template EdgeMap<T> forward_map, backward_map;
782 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
783 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
784 void set(Edge e, T a) {
786 forward_map.set(e.out, a);
788 backward_map.set(e.in, a);
790 T operator[](Edge e) const {
792 return forward_map[e.out];
794 return backward_map[e.in];
796 // T get(Edge e) const {
798 // return forward_map.get(e.out);
800 // return backward_map.get(e.in);
805 /// ErasingFirstGraphWrapper for blocking flows.
807 /// ErasingFirstGraphWrapper for blocking flows.
808 template<typename Graph, typename FirstOutEdgesMap>
809 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
811 FirstOutEdgesMap* first_out_edges;
813 ErasingFirstGraphWrapper(Graph& _graph,
814 FirstOutEdgesMap& _first_out_edges) :
815 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
817 typedef typename GraphWrapper<Graph>::Node Node;
819 // friend class GraphWrapper<Graph>;
820 // friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
821 // typename Graph::NodeIt n;
824 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
825 // NodeIt(const Invalid& i) : n(i) { }
826 // NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
827 // n(*(_G.graph)) { }
828 // operator Node() const { return Node(typename Graph::Node(n)); }
830 typedef typename GraphWrapper<Graph>::Edge Edge;
832 friend class GraphWrapper<Graph>;
833 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
834 // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
835 typename Graph::OutEdgeIt e;
838 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
839 OutEdgeIt(const Invalid& i) : e(i) { }
840 OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
842 e((*_G.first_out_edges)[_n]) { }
843 operator Edge() const { return Edge(typename Graph::Edge(e)); }
846 friend class GraphWrapper<Graph>;
847 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
848 // typedef typename Graph::InEdgeIt GraphInEdgeIt;
849 typename Graph::InEdgeIt e;
852 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
853 InEdgeIt(const Invalid& i) : e(i) { }
854 InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
856 e(*(_G.graph), typename Graph::Node(_n)) { }
857 operator Edge() const { return Edge(typename Graph::Edge(e)); }
859 //typedef typename Graph::SymEdgeIt SymEdgeIt;
861 friend class GraphWrapper<Graph>;
862 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
863 // typedef typename Graph::EdgeIt GraphEdgeIt;
864 typename Graph::EdgeIt e;
867 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
868 EdgeIt(const Invalid& i) : e(i) { }
869 EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
871 operator Edge() const { return Edge(typename Graph::Edge(e)); }
874 using GraphWrapper<Graph>::first;
875 // NodeIt& first(NodeIt& i) const {
876 // i=NodeIt(*this); return i;
878 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
879 i=OutEdgeIt(*this, p); return i;
881 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
882 i=InEdgeIt(*this, p); return i;
884 EdgeIt& first(EdgeIt& i) const {
885 i=EdgeIt(*this); return i;
888 using GraphWrapper<Graph>::next;
889 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
890 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
891 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
892 EdgeIt& next(EdgeIt& i) const { this->graph->next(i.e); return i; }
894 Node aNode(const OutEdgeIt& e) const {
895 return Node(this->graph->aNode(e.e)); }
896 Node aNode(const InEdgeIt& e) const {
897 return Node(this->graph->aNode(e.e)); }
898 Node bNode(const OutEdgeIt& e) const {
899 return Node(this->graph->bNode(e.e)); }
900 Node bNode(const InEdgeIt& e) const {
901 return Node(this->graph->bNode(e.e)); }
903 void erase(const OutEdgeIt& e) const {
906 first_out_edges->set(this->tail(e), f.e);
910 /// A wrapper for composing a bipartite graph.
911 /// \c _graph have to be a reference to a graph of type \c Graph
912 /// and \c _s_false_t_true_map is an \c IterableBoolMap
913 /// reference containing the elements for the
914 /// color classes S and T. \c _graph is to be referred to an undirected
915 /// graph or a directed graph with edges oriented from S to T.
916 template<typename Graph>
917 class BipartiteGraphWrapper : public GraphWrapper<Graph> {
918 typedef IterableBoolMap< typename Graph::template NodeMap<int> >
920 SFalseTTrueMap* s_false_t_true_map;
923 static const bool S_CLASS=false;
924 static const bool T_CLASS=true;
926 BipartiteGraphWrapper(Graph& _graph, SFalseTTrueMap& _s_false_t_true_map)
927 : GraphWrapper<Graph>(_graph), s_false_t_true_map(&_s_false_t_true_map) {
929 typedef typename GraphWrapper<Graph>::Node Node;
930 //using GraphWrapper<Graph>::NodeIt;
931 typedef typename GraphWrapper<Graph>::Edge Edge;
932 //using GraphWrapper<Graph>::EdgeIt;
937 ClassNodeIt(const Invalid& i) : n(i) { }
938 ClassNodeIt(const BipartiteGraphWrapper<Graph>& _G, bool _class) {
939 _G.s_false_t_true_map->first(n, _class);
941 //FIXME needed in new concept, important here
942 ClassNodeIt(const Node& _n) : n(_n) { }
943 operator Node() const { return n; }
949 // SNodeIt(const Invalid& i) : n(i) { }
950 // SNodeIt(const BipartiteGraphWrapper<Graph>& _G) {
951 // _G.s_false_t_true_map->first(n, false);
953 // operator Node() const { return n; }
959 // TNodeIt(const Invalid& i) : n(i) { }
960 // TNodeIt(const BipartiteGraphWrapper<Graph>& _G) {
961 // _G.s_false_t_true_map->first(n, true);
963 // operator Node() const { return n; }
968 typename Graph::OutEdgeIt e;
971 OutEdgeIt(const Invalid& i) : e(i) { }
972 OutEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) {
973 if (!(*(_G.s_false_t_true_map))[_n])
974 e=typename Graph::OutEdgeIt(*(_G.graph), typename Graph::Node(_n));
978 operator Edge() const { return Edge(typename Graph::Edge(e)); }
982 typename Graph::InEdgeIt e;
985 InEdgeIt(const Invalid& i) : e(i) { }
986 InEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) {
987 if ((*(_G.s_false_t_true_map))[_n])
988 e=typename Graph::InEdgeIt(*(_G.graph), typename Graph::Node(_n));
992 operator Edge() const { return Edge(typename Graph::Edge(e)); }
995 using GraphWrapper<Graph>::first;
996 ClassNodeIt& first(ClassNodeIt& n, bool _class) const {
997 n=SNodeIt(*this, _class) ; return n; }
998 // SNodeIt& first(SNodeIt& n) const { n=SNodeIt(*this); return n; }
999 // TNodeIt& first(TNodeIt& n) const { n=TNodeIt(*this); return n; }
1000 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1001 i=OutEdgeIt(*this, p); return i;
1003 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1004 i=InEdgeIt(*this, p); return i;
1007 using GraphWrapper<Graph>::next;
1008 ClassNodeIt& next(ClassNodeIt& n) const {
1009 this->s_false_t_true_map->next(n); return n;
1011 // SNodeIt& next(SNodeIt& n) const {
1012 // this->s_false_t_true_map->next(n); return n;
1014 // TNodeIt& next(TNodeIt& n) const {
1015 // this->s_false_t_true_map->next(n); return n;
1017 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
1018 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
1020 Node tail(const Edge& e) {
1021 if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])
1022 return Node(this->graph->tail(e));
1024 return Node(this->graph->head(e));
1026 Node head(const Edge& e) {
1027 if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])
1028 return Node(this->graph->head(e));
1030 return Node(this->graph->tail(e));
1033 Node aNode(const OutEdgeIt& e) const {
1034 return Node(this->graph->aNode(e.e));
1036 Node aNode(const InEdgeIt& e) const {
1037 return Node(this->graph->aNode(e.e));
1039 Node bNode(const OutEdgeIt& e) const {
1040 return Node(this->graph->bNode(e.e));
1042 Node bNode(const InEdgeIt& e) const {
1043 return Node(this->graph->bNode(e.e));
1046 bool inSClass(const Node& n) const {
1047 return !(*(this->s_false_t_true_map))[n];
1049 bool inTClass(const Node& n) const {
1050 return (*(this->s_false_t_true_map))[n];
1055 /// experimentral, do not try it.
1056 /// It eats a bipartite graph, oriented from S to T.
1057 /// Such one can be made e.g. by the above wrapper.
1058 template<typename Graph>
1059 class stGraphWrapper : public GraphWrapper<Graph> {
1064 //0 normalis, 1 s, 2, true, ez az iteralasi sorrend,
1065 //es a vege a false azaz (invalid, 3)
1067 friend class NodeIt;
1072 //0 normalis, 1 s->vmi, 2 vmi->t, ez a sorrend,
1073 //invalid: (invalid, 3, invalid)
1075 friend class OutEdgeIt;
1077 //normalis pontbol (first, 0, invalid), ..., (invalid, 2, vmi), ... (invalid, 3, invalid)
1078 //s-bol (invalid, 1, first), ... (invalid, 3, invalid)
1079 //t-bol (invalid, 3, invalid)
1081 friend class InEdgeIt;
1083 //normalis pontbol (first, 0, invalid), ..., (invalid, 1, vmi), ... (invalid, 3, invalid)
1084 //s-be (invalid, 3, invalid)
1085 //t-be (invalid, 2, first), ... (invalid, 3, invalid)
1087 friend class EdgeIt;
1088 //(first, 0, invalid) ...
1091 //invalid, 3, invalid)
1092 template <typename T> class NodeMap;
1093 template <typename T> class EdgeMap;
1095 // template <typename T> friend class NodeMap;
1096 // template <typename T> friend class EdgeMap;
1101 static const bool S_CLASS=false;
1102 static const bool T_CLASS=true;
1104 stGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) ,
1106 T_NODE(INVALID, 2) { }
1108 class Node : public Graph::Node {
1110 friend class GraphWrapper<Graph>;
1111 friend class stGraphWrapper<Graph>;
1112 template <typename T> friend class NodeMap;
1114 friend class OutEdgeIt;
1115 friend class InEdgeIt;
1116 friend class EdgeIt;
1120 Node(const typename Graph::Node& _n, int _spec=0) :
1121 Graph::Node(_n), spec(_spec) { }
1122 Node(const Invalid& i) : Graph::Node(i), spec(3) { }
1123 friend bool operator==(const Node& u, const Node& v) {
1124 return (u.spec==v.spec &&
1125 static_cast<typename Graph::Node>(u)==
1126 static_cast<typename Graph::Node>(v));
1128 friend bool operator!=(const Node& u, const Node& v) {
1129 return (v.spec!=u.spec ||
1130 static_cast<typename Graph::Node>(u)!=
1131 static_cast<typename Graph::Node>(v));
1133 int getSpec() const { return spec; }
1136 friend class GraphWrapper<Graph>;
1137 friend class stGraphWrapper<Graph>;
1138 typename Graph::NodeIt n;
1142 NodeIt(const typename Graph::NodeIt& _n, int _spec) :
1143 n(_n), spec(_spec) { }
1144 NodeIt(const Invalid& i) : n(i), spec(3) { }
1145 NodeIt(const stGraphWrapper<Graph>& _G) : n(*(_G.graph)), spec(0) {
1146 if (!_G->valid(n)) spec=1;
1148 operator Node() const { return Node(n, spec); }
1150 class Edge : public Graph::Edge {
1151 friend class GraphWrapper<Graph>;
1152 friend class stGraphWrapper<Graph>;
1153 template <typename T> friend class EdgeMap;
1155 typename Graph::Node n;
1158 Edge(const typename Graph::Edge& _e, int _spec,
1159 const typename Graph::Node& _n) :
1160 Graph::Edge(_e), spec(_spec), n(_n) {
1162 Edge(const Invalid& i) : Graph::Edge(i), spec(3), n(i) { }
1163 friend bool operator==(const Edge& u, const Edge& v) {
1164 return (u.spec==v.spec &&
1165 static_cast<typename Graph::Edge>(u)==
1166 static_cast<typename Graph::Edge>(v) &&
1169 friend bool operator!=(const Edge& u, const Edge& v) {
1170 return (v.spec!=u.spec ||
1171 static_cast<typename Graph::Edge>(u)!=
1172 static_cast<typename Graph::Edge>(v) ||
1175 int getSpec() const { return spec; }
1178 friend class GraphWrapper<Graph>;
1179 friend class stGraphWrapper<Graph>;
1180 typename Graph::OutEdgeIt e;
1182 typename Graph::ClassNodeIt n;
1185 OutEdgeIt(const typename Graph::OutEdgeIt& _e, int _spec,
1186 const typename Graph::ClassNodeIt& _n) :
1187 e(_e), spec(_spec), n(_n) {
1189 OutEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1190 OutEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) {
1193 if (_G.graph->inSClass(_n)) { //S, van normalis kiel
1194 e=typename Graph::OutEdgeIt(*(_G.graph),
1195 typename Graph::Node(_n));
1198 if (!_G.graph->valid(e)) spec=3;
1199 } else { //T, specko kiel van
1208 _G.graph->first(n, S_CLASS); //s->vmi;
1209 if (!_G.graph->valid(n)) spec=3; //Ha S ures
1218 operator Edge() const { return Edge(e, spec, n); }
1221 friend class GraphWrapper<Graph>;
1222 friend class stGraphWrapper<Graph>;
1223 typename Graph::InEdgeIt e;
1225 typename Graph::ClassNodeIt n;
1228 InEdgeIt(const typename Graph::InEdgeIt& _e, int _spec,
1229 const typename Graph::ClassNodeIt& _n) :
1230 e(_e), spec(_spec), n(_n) {
1232 InEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1233 InEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) {
1236 if (_G.graph->inTClass(_n)) { //T, van normalis beel
1237 e=typename Graph::InEdgeIt(*(_G.graph),
1238 typename Graph::Node(_n));
1241 if (!_G.graph->valid(e)) spec=3;
1242 } else { //S, specko beel van
1255 _G.graph->first(n, T_CLASS); //vmi->t;
1256 if (!_G.graph->valid(n)) spec=3; //Ha T ures
1260 operator Edge() const { return Edge(e, spec, n); }
1263 friend class GraphWrapper<Graph>;
1264 friend class stGraphWrapper<Graph>;
1265 typename Graph::EdgeIt e;
1267 typename Graph::ClassNodeIt n;
1270 EdgeIt(const typename Graph::EdgeIt& _e, int _spec,
1271 const typename Graph::ClassNodeIt& _n) :
1272 e(_e), spec(_spec), n(_n) { }
1273 EdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1274 EdgeIt(const stGraphWrapper<Graph>& _G) :
1275 e(*(_G.graph)), spec(0), n(INVALID) {
1276 if (!_G.graph->valid(e)) {
1278 _G.graph->first(n, S_CLASS);
1279 if (!_G.graph->valid(n)) { //Ha S ures
1281 _G.graph->first(n, T_CLASS);
1282 if (!_G.graph->valid(n)) { //Ha T ures
1288 operator Edge() const { return Edge(e, spec, n); }
1291 NodeIt& first(NodeIt& i) const {
1292 i=NodeIt(*this); return i;
1294 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1295 i=OutEdgeIt(*this, p); return i;
1297 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1298 i=InEdgeIt(*this, p); return i;
1300 EdgeIt& first(EdgeIt& i) const {
1301 i=EdgeIt(*this); return i;
1304 NodeIt& next(NodeIt& i) const {
1307 this->graph->next(i.n);
1308 if (!this->graph->valid(i.n)) {
1321 OutEdgeIt& next(OutEdgeIt& i) const {
1323 case 0: //normal edge
1324 typename Graph::Node v=this->graph->aNode(i.e);
1325 this->graph->next(i.e);
1326 if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk
1327 if (this->graph->inSClass(v)) { //S, nincs kiel
1330 } else { //T, van kiel
1337 this->graph->next(i.n);
1338 if (!this->graph->valid(i.n)) i.spec=3;
1347 InEdgeIt& next(InEdgeIt& i) const {
1349 case 0: //normal edge
1350 typename Graph::Node v=this->graph->aNode(i.e);
1351 this->graph->next(i.e);
1352 if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk
1353 if (this->graph->inTClass(v)) { //S, nincs beel
1356 } else { //S, van beel
1367 this->graph->next(i.n);
1368 if (!this->graph->valid(i.n)) i.spec=3;
1374 EdgeIt& next(EdgeIt& i) const {
1377 this->graph->next(i.e);
1378 if (!this->graph->valid(i.e)) {
1380 this->graph->first(i.n, S_CLASS);
1381 if (!this->graph->valid(i.n)) {
1383 this->graph->first(i.n, T_CLASS);
1384 if (!this->graph->valid(i.n)) i.spec=3;
1389 this->graph->next(i.n);
1390 if (!this->graph->valid(i.n)) {
1392 this->graph->first(i.n, T_CLASS);
1393 if (!this->graph->valid(i.n)) i.spec=3;
1397 this->graph->next(i.n);
1398 if (!this->graph->valid(i.n)) i.spec=3;
1404 Node tail(const Edge& e) const {
1407 return Node(this->graph->tail(e));
1417 Node head(const Edge& e) const {
1420 return Node(this->graph->head(e));
1431 bool valid(const Node& n) const { return (n.spec<3); }
1432 bool valid(const Edge& e) const { return (e.spec<3); }
1434 // int nodeNum() const { return this->graph->nodeNum(); }
1435 // int edgeNum() const { return this->graph->edgeNum(); }
1437 Node aNode(const OutEdgeIt& e) const { return tail(e); }
1438 Node aNode(const InEdgeIt& e) const { return head(e); }
1439 Node bNode(const OutEdgeIt& e) const { return head(e); }
1440 Node bNode(const InEdgeIt& e) const { return tail(e); }
1442 // Node addNode() const { return Node(this->graph->addNode()); }
1443 // Edge addEdge(const Node& tail, const Node& head) const {
1444 // return Edge(this->graph->addEdge(tail, head)); }
1446 // void erase(const Node& i) const { this->graph->erase(i); }
1447 // void erase(const Edge& i) const { this->graph->erase(i); }
1449 // void clear() const { this->graph->clear(); }
1451 template<typename T> class NodeMap : public GraphWrapper<Graph>::template NodeMap<T> {
1452 typedef typename GraphWrapper<Graph>::template NodeMap<T> Parent;
1455 NodeMap(const stGraphWrapper<Graph>& _G) : Parent(_G) { }
1456 NodeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1459 T operator[](const Node& n) const {
1472 void set(const Node& n, T t) {
1475 GraphWrapper<Graph>::template NodeMap<T>::set(n, t);
1487 template<typename T> class EdgeMap : public GraphWrapper<Graph>::template EdgeMap<T> {
1488 typedef typename Graph::template NodeMap<T> Parent;
1489 typename GraphWrapper<Graph>::template NodeMap<T> node_value;
1491 EdgeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),
1493 EdgeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1494 node_value(_G, a) { }
1495 T operator[](const Edge& e) const {
1501 return node_value[e.n];
1504 return node_value[e.n];
1508 void set(const Edge& e, T t) {
1511 GraphWrapper<Graph>::set(e, t);
1514 node_value.set(e, t);
1517 node_value.set(e, t);
1527 #endif //HUGO_GRAPH_WRAPPER_H