2 #ifndef HUGO_GRAPH_WRAPPER_H
3 #define HUGO_GRAPH_WRAPPER_H
12 /// \addtogroup gwrappers
13 /// A main parts of HUGOlib are the different graph structures,
14 /// generic graph algorithms, graph concepts which couple these, and
15 /// graph wrappers. While the previous ones are more or less clear, the
16 /// latter notion needs further explanation.
17 /// Graph wrappers are graph classes which serve for considering graph
18 /// structures in different ways. A short example makes the notion much
20 /// Suppose that we have an instance \c g of a directed graph
21 /// type say \c ListGraph and an algorithm
22 /// \code template<typename Graph> int algorithm(const Graph&); \endcode
23 /// is needed to run on the reversely oriented graph.
24 /// It may be expensive (in time or in memory usage) to copy
25 /// \c g with the reverse orientation.
26 /// Thus, a wrapper class
27 /// \code template<typename Graph> class RevGraphWrapper; \endcode is used.
28 /// The code looks as follows
31 /// RevGraphWrapper<ListGraph> rgw(g);
32 /// int result=algorithm(rgw);
34 /// After running the algorithm, the original graph \c g
35 /// remains untouched. Thus the graph wrapper used above is to consider the
36 /// original graph with reverse orientation.
37 /// This techniques gives rise to an elegant code, and
38 /// based on stable graph wrappers, complex algorithms can be
39 /// implemented easily.
40 /// In flow, circulation and bipartite matching problems, the residual
41 /// graph is of particular importance. Combining a wrapper implementing
42 /// this, shortest path algorithms and minimum mean cycle algorithms,
43 /// a range of weighted and cardinality optimization algorithms can be
44 /// obtained. For lack of space, for other examples,
45 /// the interested user is referred to the detailed documentation of graph
47 /// The behavior of graph wrappers can be very different. Some of them keep
48 /// capabilities of the original graph while in other cases this would be
49 /// meaningless. This means that the concepts that they are a model of depend
50 /// on the graph wrapper, and the wrapped graph(s).
51 /// If an edge of \c rgw is deleted, this is carried out by
52 /// deleting the corresponding edge of \c g. But for a residual
53 /// graph, this operation has no sense.
54 /// Let we stand one more example here to simplify your work.
56 /// \code template<typename Graph> class RevGraphWrapper; \endcode
58 /// <tt> RevGraphWrapper(Graph& _g)</tt>.
59 /// This means that in a situation,
60 /// when a <tt> const ListGraph& </tt> reference to a graph is given,
61 /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
63 /// int algorithm1(const ListGraph& g) {
64 /// RevGraphWrapper<const ListGraph> rgw(g);
65 /// return algorithm2(rgw);
69 /// \addtogroup gwrappers
72 ///Base type for the Graph Wrappers
74 ///This is the base type for the Graph Wrappers.
75 ///\todo Some more docs...
77 template<typename Graph>
83 typedef Graph BaseGraph;
84 typedef Graph ParentGraph;
86 // GraphWrapper() : graph(0) { }
87 GraphWrapper(Graph& _graph) : graph(&_graph) { }
88 // void setGraph(Graph& _graph) { graph=&_graph; }
89 // Graph& getGraph() const { return *graph; }
91 // typedef typename Graph::Node Node;
92 class Node : public Graph::Node {
93 friend class GraphWrapper<Graph>;
96 Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
97 Node(const Invalid& i) : Graph::Node(i) { }
100 friend class GraphWrapper<Graph>;
101 typename Graph::NodeIt n;
104 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
105 NodeIt(const Invalid& i) : n(i) { }
106 NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { }
107 operator Node() const { return Node(typename Graph::Node(n)); }
109 // typedef typename Graph::Edge Edge;
110 class Edge : public Graph::Edge {
111 friend class GraphWrapper<Graph>;
114 Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
115 Edge(const Invalid& i) : Graph::Edge(i) { }
118 friend class GraphWrapper<Graph>;
119 typename Graph::OutEdgeIt e;
122 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
123 OutEdgeIt(const Invalid& i) : e(i) { }
124 OutEdgeIt(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)); }
129 friend class GraphWrapper<Graph>;
130 typename Graph::InEdgeIt e;
133 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
134 InEdgeIt(const Invalid& i) : e(i) { }
135 InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
136 e(*(_G.graph), typename Graph::Node(_n)) { }
137 operator Edge() const { return Edge(typename Graph::Edge(e)); }
139 //typedef typename Graph::SymEdgeIt SymEdgeIt;
141 friend class GraphWrapper<Graph>;
142 typename Graph::EdgeIt e;
145 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
146 EdgeIt(const Invalid& i) : e(i) { }
147 EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
148 operator Edge() const { return Edge(typename Graph::Edge(e)); }
151 NodeIt& first(NodeIt& i) const {
152 i=NodeIt(*this); return i;
154 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
155 i=OutEdgeIt(*this, p); return i;
157 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
158 i=InEdgeIt(*this, p); return i;
160 EdgeIt& first(EdgeIt& i) const {
161 i=EdgeIt(*this); return i;
164 NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
165 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
166 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
167 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
169 Node tail(const Edge& e) const {
170 return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
171 Node head(const Edge& e) const {
172 return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
174 bool valid(const Node& n) const {
175 return graph->valid(static_cast<typename Graph::Node>(n)); }
176 bool valid(const Edge& e) const {
177 return graph->valid(static_cast<typename Graph::Edge>(e)); }
179 int nodeNum() const { return graph->nodeNum(); }
180 int edgeNum() const { return graph->edgeNum(); }
182 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
183 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
184 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
185 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
187 Node addNode() const { return Node(graph->addNode()); }
188 Edge addEdge(const Node& tail, const Node& head) const {
189 return Edge(graph->addEdge(tail, head)); }
191 void erase(const Node& i) const { graph->erase(i); }
192 void erase(const Edge& i) const { graph->erase(i); }
194 void clear() const { graph->clear(); }
196 template<typename T> class NodeMap : public Graph::template NodeMap<T> {
197 typedef typename Graph::template NodeMap<T> Parent;
199 NodeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
200 NodeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
203 template<typename T> class EdgeMap : public Graph::template EdgeMap<T> {
204 typedef typename Graph::template EdgeMap<T> Parent;
206 EdgeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
207 EdgeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
211 /// A graph wrapper which reverses the orientation of the edges.
213 /// A graph wrapper which reverses the orientation of the edges.
214 template<typename Graph>
215 class RevGraphWrapper : public GraphWrapper<Graph> {
218 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
220 typedef typename GraphWrapper<Graph>::Node Node;
221 typedef typename GraphWrapper<Graph>::Edge Edge;
222 //If Graph::OutEdgeIt is not defined
223 //and we do not want to use RevGraphWrapper::InEdgeIt,
224 //the typdef techinque does not work.
225 //Unfortunately all the typedefs are instantiated in templates.
226 //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
227 //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
230 friend class GraphWrapper<Graph>;
231 friend class RevGraphWrapper<Graph>;
232 typename Graph::InEdgeIt e;
235 OutEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
236 OutEdgeIt(const Invalid& i) : e(i) { }
237 OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
238 e(*(_G.graph), typename Graph::Node(_n)) { }
239 operator Edge() const { return Edge(typename Graph::Edge(e)); }
242 friend class GraphWrapper<Graph>;
243 friend class RevGraphWrapper<Graph>;
244 typename Graph::OutEdgeIt e;
247 InEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
248 InEdgeIt(const Invalid& i) : e(i) { }
249 InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
250 e(*(_G.graph), typename Graph::Node(_n)) { }
251 operator Edge() const { return Edge(typename Graph::Edge(e)); }
254 using GraphWrapper<Graph>::first;
255 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
256 i=OutEdgeIt(*this, p); return i;
258 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
259 i=InEdgeIt(*this, p); return i;
262 using GraphWrapper<Graph>::next;
263 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
264 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
266 Node aNode(const OutEdgeIt& e) const {
267 return Node(this->graph->aNode(e.e)); }
268 Node aNode(const InEdgeIt& e) const {
269 return Node(this->graph->aNode(e.e)); }
270 Node bNode(const OutEdgeIt& e) const {
271 return Node(this->graph->bNode(e.e)); }
272 Node bNode(const InEdgeIt& e) const {
273 return Node(this->graph->bNode(e.e)); }
275 Node tail(const Edge& e) const {
276 return GraphWrapper<Graph>::head(e); }
277 Node head(const Edge& e) const {
278 return GraphWrapper<Graph>::tail(e); }
282 /// Wrapper for hiding nodes and edges from a graph.
284 /// This wrapper shows a graph with filtered node-set and
285 /// edge-set. The quick brown fox iterator jumps over
286 /// the lazy dog nodes or edges if the values for them are false
287 /// in the bool maps.
288 template<typename Graph, typename NodeFilterMap,
289 typename EdgeFilterMap>
290 class SubGraphWrapper : public GraphWrapper<Graph> {
292 NodeFilterMap* node_filter_map;
293 EdgeFilterMap* edge_filter_map;
296 SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
297 EdgeFilterMap& _edge_filter_map) :
298 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
299 edge_filter_map(&_edge_filter_map) { }
301 typedef typename GraphWrapper<Graph>::Node Node;
303 friend class GraphWrapper<Graph>;
304 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
305 typename Graph::NodeIt n;
308 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
309 NodeIt(const Invalid& i) : n(i) { }
310 NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
312 while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])
315 operator Node() const { return Node(typename Graph::Node(n)); }
317 typedef typename GraphWrapper<Graph>::Edge Edge;
319 friend class GraphWrapper<Graph>;
320 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
321 typename Graph::OutEdgeIt e;
324 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
325 OutEdgeIt(const Invalid& i) : e(i) { }
326 OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
328 e(*(_G.graph), typename Graph::Node(_n)) {
329 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
332 operator Edge() const { return Edge(typename Graph::Edge(e)); }
335 friend class GraphWrapper<Graph>;
336 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
337 typename Graph::InEdgeIt e;
340 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
341 InEdgeIt(const Invalid& i) : e(i) { }
342 InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
344 e(*(_G.graph), typename Graph::Node(_n)) {
345 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
348 operator Edge() const { return Edge(typename Graph::Edge(e)); }
350 //typedef typename Graph::SymEdgeIt SymEdgeIt;
352 friend class GraphWrapper<Graph>;
353 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
354 typename Graph::EdgeIt e;
357 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
358 EdgeIt(const Invalid& i) : e(i) { }
359 EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
361 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
364 operator Edge() const { return Edge(typename Graph::Edge(e)); }
367 NodeIt& first(NodeIt& i) const {
368 i=NodeIt(*this); return i;
370 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
371 i=OutEdgeIt(*this, p); return i;
373 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
374 i=InEdgeIt(*this, p); return i;
376 EdgeIt& first(EdgeIt& i) const {
377 i=EdgeIt(*this); return i;
380 NodeIt& next(NodeIt& i) const {
381 this->graph->next(i.n);
382 while (this->graph->valid(i) && !(*node_filter_map)[i.n]) {
383 this->graph->next(i.n); }
386 OutEdgeIt& next(OutEdgeIt& i) const {
387 this->graph->next(i.e);
388 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
389 this->graph->next(i.e); }
392 InEdgeIt& next(InEdgeIt& i) const {
393 this->graph->next(i.e);
394 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
395 this->graph->next(i.e); }
398 EdgeIt& next(EdgeIt& i) const {
399 this->graph->next(i.e);
400 while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
401 this->graph->next(i.e); }
405 Node aNode(const OutEdgeIt& e) const {
406 return Node(this->graph->aNode(e.e)); }
407 Node aNode(const InEdgeIt& e) const {
408 return Node(this->graph->aNode(e.e)); }
409 Node bNode(const OutEdgeIt& e) const {
410 return Node(this->graph->bNode(e.e)); }
411 Node bNode(const InEdgeIt& e) const {
412 return Node(this->graph->bNode(e.e)); }
415 ///Some doki, please.
416 void hide(const Node& n) const { node_filter_map->set(n, false); }
418 ///Some doki, please.
419 void hide(const Edge& e) const { edge_filter_map->set(e, false); }
422 ///Some doki, please.
423 void unHide(const Node& n) const { node_filter_map->set(n, true); }
425 ///Some doki, please.
426 void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
429 ///Some doki, please.
430 bool hidden(const Node& n) const { return (*node_filter_map)[n]; }
432 ///Some doki, please.
433 bool hidden(const Edge& e) const { return (*edge_filter_map)[e]; }
436 /// A wrapper for forgetting the orientation of a graph.
438 /// A wrapper for getting an undirected graph by forgetting
439 /// the orientation of a directed one.
440 template<typename Graph>
441 class UndirGraphWrapper : public GraphWrapper<Graph> {
443 typedef typename GraphWrapper<Graph>::Node Node;
444 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
445 typedef typename GraphWrapper<Graph>::Edge Edge;
446 typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
448 UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
451 friend class UndirGraphWrapper<Graph>;
452 bool out_or_in; //true iff out
453 typename Graph::OutEdgeIt out;
454 typename Graph::InEdgeIt in;
457 OutEdgeIt(const Invalid& i) : Edge(i) { }
458 OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
459 out_or_in=true; _G.graph->first(out, _n);
460 if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n); }
462 operator Edge() const {
463 if (out_or_in) return Edge(out); else return Edge(in);
468 typedef OutEdgeIt InEdgeIt;
470 using GraphWrapper<Graph>::first;
471 // NodeIt& first(NodeIt& i) const {
472 // i=NodeIt(*this); return i;
474 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
475 i=OutEdgeIt(*this, p); return i;
478 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
479 // i=InEdgeIt(*this, p); return i;
481 // EdgeIt& first(EdgeIt& i) const {
482 // i=EdgeIt(*this); return i;
485 using GraphWrapper<Graph>::next;
486 // NodeIt& next(NodeIt& n) const {
487 // GraphWrapper<Graph>::next(n);
490 OutEdgeIt& next(OutEdgeIt& e) const {
492 typename Graph::Node n=this->graph->tail(e.out);
493 this->graph->next(e.out);
494 if (!this->graph->valid(e.out)) {
495 e.out_or_in=false; this->graph->first(e.in, n); }
497 this->graph->next(e.in);
502 // EdgeIt& next(EdgeIt& e) const {
503 // GraphWrapper<Graph>::next(n);
504 // // graph->next(e.e);
508 Node aNode(const OutEdgeIt& e) const {
509 if (e.out_or_in) return this->graph->tail(e); else
510 return this->graph->head(e); }
511 Node bNode(const OutEdgeIt& e) const {
512 if (e.out_or_in) return this->graph->head(e); else
513 return this->graph->tail(e); }
516 /// A wrapper for composing the residual graph for directed flow and circulation problems.
518 /// A wrapper for composing the residual graph for directed flow and circulation problems.
519 template<typename Graph, typename Number,
520 typename CapacityMap, typename FlowMap>
521 class ResGraphWrapper : public GraphWrapper<Graph> {
523 const CapacityMap* capacity;
527 ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
529 GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
534 friend class OutEdgeIt;
536 typedef typename GraphWrapper<Graph>::Node Node;
537 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
538 class Edge : public Graph::Edge {
539 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
541 bool forward; //true, iff forward
542 // typename Graph::Edge e;
545 Edge(const typename Graph::Edge& _e, bool _forward) :
546 Graph::Edge(_e), forward(_forward) { }
547 Edge(const Invalid& i) : Graph::Edge(i), forward(false) { }
548 //the unique invalid iterator
549 friend bool operator==(const Edge& u, const Edge& v) {
550 return (v.forward==u.forward &&
551 static_cast<typename Graph::Edge>(u)==
552 static_cast<typename Graph::Edge>(v));
554 friend bool operator!=(const Edge& u, const Edge& v) {
555 return (v.forward!=u.forward ||
556 static_cast<typename Graph::Edge>(u)!=
557 static_cast<typename Graph::Edge>(v));
562 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
564 typename Graph::OutEdgeIt out;
565 typename Graph::InEdgeIt in;
570 // OutEdgeIt(const Edge& e) : Edge(e) { }
571 OutEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
572 //the unique invalid iterator
573 OutEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
575 resG.graph->first(out, v);
576 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
577 if (!resG.graph->valid(out)) {
579 resG.graph->first(in, v);
580 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
583 operator Edge() const {
585 // e.forward=this->forward;
586 // if (this->forward) e=out; else e=in;
589 return Edge(out, this->forward);
591 return Edge(in, this->forward);
596 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
598 typename Graph::OutEdgeIt out;
599 typename Graph::InEdgeIt in;
604 // OutEdgeIt(const Edge& e) : Edge(e) { }
605 InEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
606 //the unique invalid iterator
607 InEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
609 resG.graph->first(in, v);
610 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
611 if (!resG.graph->valid(in)) {
613 resG.graph->first(out, v);
614 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
617 operator Edge() const {
619 // e.forward=this->forward;
620 // if (this->forward) e=out; else e=in;
623 return Edge(in, this->forward);
625 return Edge(out, this->forward);
630 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
632 typename Graph::EdgeIt e;
636 EdgeIt(const Invalid& i) : e(i), forward(false) { }
637 EdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG) {
639 resG.graph->first(e);
640 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
641 if (!resG.graph->valid(e)) {
643 resG.graph->first(e);
644 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
647 operator Edge() const {
648 return Edge(e, this->forward);
652 using GraphWrapper<Graph>::first;
653 // NodeIt& first(NodeIt& i) const {
654 // i=NodeIt(*this); return i;
656 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
657 i=OutEdgeIt(*this, p); return i;
660 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
661 i=InEdgeIt(*this, p); return i;
663 EdgeIt& first(EdgeIt& i) const {
664 i=EdgeIt(*this); return i;
667 using GraphWrapper<Graph>::next;
668 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
669 OutEdgeIt& next(OutEdgeIt& e) const {
671 Node v=this->graph->aNode(e.out);
672 this->graph->next(e.out);
673 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
674 this->graph->next(e.out); }
675 if (!this->graph->valid(e.out)) {
677 this->graph->first(e.in, v);
678 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
679 this->graph->next(e.in); }
682 this->graph->next(e.in);
683 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
684 this->graph->next(e.in); }
689 InEdgeIt& next(InEdgeIt& e) const {
691 Node v=this->graph->aNode(e.in);
692 this->graph->next(e.in);
693 while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
694 this->graph->next(e.in); }
695 if (!this->graph->valid(e.in)) {
697 this->graph->first(e.out, v);
698 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
699 this->graph->next(e.out); }
702 this->graph->next(e.out);
703 while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
704 this->graph->next(e.out); }
708 EdgeIt& next(EdgeIt& e) const {
710 this->graph->next(e.e);
711 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
712 this->graph->next(e.e); }
713 if (!this->graph->valid(e.e)) {
715 this->graph->first(e.e);
716 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
717 this->graph->next(e.e); }
720 this->graph->next(e.e);
721 while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
722 this->graph->next(e.e); }
727 Node tail(Edge e) const {
728 return ((e.forward) ? this->graph->tail(e) : this->graph->head(e)); }
729 Node head(Edge e) const {
730 return ((e.forward) ? this->graph->head(e) : this->graph->tail(e)); }
732 Node aNode(OutEdgeIt e) const {
733 return ((e.forward) ? this->graph->aNode(e.out) :
734 this->graph->aNode(e.in)); }
735 Node bNode(OutEdgeIt e) const {
736 return ((e.forward) ? this->graph->bNode(e.out) :
737 this->graph->bNode(e.in)); }
739 Node aNode(InEdgeIt e) const {
740 return ((e.forward) ? this->graph->aNode(e.in) :
741 this->graph->aNode(e.out)); }
742 Node bNode(InEdgeIt e) const {
743 return ((e.forward) ? this->graph->bNode(e.in) :
744 this->graph->bNode(e.out)); }
746 // int nodeNum() const { return graph->nodeNum(); }
748 void edgeNum() const { }
749 //int edgeNum() const { return graph->edgeNum(); }
752 // int id(Node v) const { return graph->id(v); }
754 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
755 bool valid(Edge e) const {
756 return this->graph->valid(e);
757 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
760 void augment(const Edge& e, Number a) const {
762 // flow->set(e.out, flow->get(e.out)+a);
763 flow->set(e, (*flow)[e]+a);
765 // flow->set(e.in, flow->get(e.in)-a);
766 flow->set(e, (*flow)[e]-a);
769 Number resCap(const Edge& e) const {
771 // return (capacity->get(e.out)-flow->get(e.out));
772 return ((*capacity)[e]-(*flow)[e]);
774 // return (flow->get(e.in));
778 // Number resCap(typename Graph::OutEdgeIt out) const {
779 // // return (capacity->get(out)-flow->get(out));
780 // return ((*capacity)[out]-(*flow)[out]);
783 // Number resCap(typename Graph::InEdgeIt in) const {
784 // // return (flow->get(in));
785 // return ((*flow)[in]);
788 template <typename T>
790 typename Graph::template EdgeMap<T> forward_map, backward_map;
792 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
793 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
794 void set(Edge e, T a) {
796 forward_map.set(e.out, a);
798 backward_map.set(e.in, a);
800 T operator[](Edge e) const {
802 return forward_map[e.out];
804 return backward_map[e.in];
806 // T get(Edge e) const {
808 // return forward_map.get(e.out);
810 // return backward_map.get(e.in);
815 /// ErasingFirstGraphWrapper for blocking flows.
817 /// ErasingFirstGraphWrapper for blocking flows.
818 template<typename Graph, typename FirstOutEdgesMap>
819 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
821 FirstOutEdgesMap* first_out_edges;
823 ErasingFirstGraphWrapper(Graph& _graph,
824 FirstOutEdgesMap& _first_out_edges) :
825 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
827 typedef typename GraphWrapper<Graph>::Node Node;
829 // friend class GraphWrapper<Graph>;
830 // friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
831 // typename Graph::NodeIt n;
834 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
835 // NodeIt(const Invalid& i) : n(i) { }
836 // NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
837 // n(*(_G.graph)) { }
838 // operator Node() const { return Node(typename Graph::Node(n)); }
840 typedef typename GraphWrapper<Graph>::Edge Edge;
842 friend class GraphWrapper<Graph>;
843 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
844 // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
845 typename Graph::OutEdgeIt e;
848 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
849 OutEdgeIt(const Invalid& i) : e(i) { }
850 OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
852 e((*_G.first_out_edges)[_n]) { }
853 operator Edge() const { return Edge(typename Graph::Edge(e)); }
856 friend class GraphWrapper<Graph>;
857 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
858 // typedef typename Graph::InEdgeIt GraphInEdgeIt;
859 typename Graph::InEdgeIt e;
862 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
863 InEdgeIt(const Invalid& i) : e(i) { }
864 InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
866 e(*(_G.graph), typename Graph::Node(_n)) { }
867 operator Edge() const { return Edge(typename Graph::Edge(e)); }
869 //typedef typename Graph::SymEdgeIt SymEdgeIt;
871 friend class GraphWrapper<Graph>;
872 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
873 // typedef typename Graph::EdgeIt GraphEdgeIt;
874 typename Graph::EdgeIt e;
877 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
878 EdgeIt(const Invalid& i) : e(i) { }
879 EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
881 operator Edge() const { return Edge(typename Graph::Edge(e)); }
884 using GraphWrapper<Graph>::first;
885 // NodeIt& first(NodeIt& i) const {
886 // i=NodeIt(*this); return i;
888 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
889 i=OutEdgeIt(*this, p); return i;
891 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
892 i=InEdgeIt(*this, p); return i;
894 EdgeIt& first(EdgeIt& i) const {
895 i=EdgeIt(*this); return i;
898 using GraphWrapper<Graph>::next;
899 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
900 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
901 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
902 EdgeIt& next(EdgeIt& i) const { this->graph->next(i.e); return i; }
904 Node aNode(const OutEdgeIt& e) const {
905 return Node(this->graph->aNode(e.e)); }
906 Node aNode(const InEdgeIt& e) const {
907 return Node(this->graph->aNode(e.e)); }
908 Node bNode(const OutEdgeIt& e) const {
909 return Node(this->graph->bNode(e.e)); }
910 Node bNode(const InEdgeIt& e) const {
911 return Node(this->graph->bNode(e.e)); }
913 void erase(const OutEdgeIt& e) const {
916 first_out_edges->set(this->tail(e), f.e);
920 /// A wrapper for composing a bipartite graph.
921 /// \c _graph have to be a reference to a graph of type \c Graph
922 /// and \c _s_false_t_true_map is an \c IterableBoolMap
923 /// reference containing the elements for the
924 /// color classes S and T. \c _graph is to be referred to an undirected
925 /// graph or a directed graph with edges oriented from S to T.
926 template<typename Graph>
927 class BipartiteGraphWrapper : public GraphWrapper<Graph> {
928 typedef IterableBoolMap< typename Graph::template NodeMap<int> >
930 SFalseTTrueMap* s_false_t_true_map;
934 //FIXME vhogy igy kellene, csak az en forditom nem eszi meg
935 //static const bool S_CLASS=false;
936 //static const bool T_CLASS=true;
941 BipartiteGraphWrapper(Graph& _graph, SFalseTTrueMap& _s_false_t_true_map)
942 : GraphWrapper<Graph>(_graph), s_false_t_true_map(&_s_false_t_true_map),
943 S_CLASS(false), T_CLASS(true) { }
944 typedef typename GraphWrapper<Graph>::Node Node;
945 //using GraphWrapper<Graph>::NodeIt;
946 typedef typename GraphWrapper<Graph>::Edge Edge;
947 //using GraphWrapper<Graph>::EdgeIt;
949 friend class ClassNodeIt;
951 friend class OutEdgeIt;
953 friend class InEdgeIt;
955 friend class BipartiteGraphWrapper<Graph>;
960 ClassNodeIt(const Invalid& i) : n(i) { }
961 ClassNodeIt(const BipartiteGraphWrapper<Graph>& _G, bool _class) {
962 _G.s_false_t_true_map->first(n, _class);
964 //FIXME needed in new concept, important here
965 ClassNodeIt(const Node& _n) : n(_n) { }
966 operator Node() const { return n; }
972 // SNodeIt(const Invalid& i) : n(i) { }
973 // SNodeIt(const BipartiteGraphWrapper<Graph>& _G) {
974 // _G.s_false_t_true_map->first(n, false);
976 // operator Node() const { return n; }
982 // TNodeIt(const Invalid& i) : n(i) { }
983 // TNodeIt(const BipartiteGraphWrapper<Graph>& _G) {
984 // _G.s_false_t_true_map->first(n, true);
986 // operator Node() const { return n; }
989 friend class BipartiteGraphWrapper<Graph>;
991 typename Graph::OutEdgeIt e;
994 OutEdgeIt(const Invalid& i) : e(i) { }
995 OutEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) {
996 if (!(*(_G.s_false_t_true_map))[_n])
997 e=typename Graph::OutEdgeIt(*(_G.graph), typename Graph::Node(_n));
1001 operator Edge() const { return Edge(typename Graph::Edge(e)); }
1004 friend class BipartiteGraphWrapper<Graph>;
1006 typename Graph::InEdgeIt e;
1009 InEdgeIt(const Invalid& i) : e(i) { }
1010 InEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) {
1011 if ((*(_G.s_false_t_true_map))[_n])
1012 e=typename Graph::InEdgeIt(*(_G.graph), typename Graph::Node(_n));
1016 operator Edge() const { return Edge(typename Graph::Edge(e)); }
1019 using GraphWrapper<Graph>::first;
1020 ClassNodeIt& first(ClassNodeIt& n, bool _class) const {
1021 n=ClassNodeIt(*this, _class) ; return n; }
1022 // SNodeIt& first(SNodeIt& n) const { n=SNodeIt(*this); return n; }
1023 // TNodeIt& first(TNodeIt& n) const { n=TNodeIt(*this); return n; }
1024 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1025 i=OutEdgeIt(*this, p); return i;
1027 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1028 i=InEdgeIt(*this, p); return i;
1031 using GraphWrapper<Graph>::next;
1032 ClassNodeIt& next(ClassNodeIt& n) const {
1033 this->s_false_t_true_map->next(n.n); return n;
1035 // SNodeIt& next(SNodeIt& n) const {
1036 // this->s_false_t_true_map->next(n); return n;
1038 // TNodeIt& next(TNodeIt& n) const {
1039 // this->s_false_t_true_map->next(n); return n;
1041 OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
1042 InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
1044 Node tail(const Edge& e) {
1045 if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])
1046 return Node(this->graph->tail(e));
1048 return Node(this->graph->head(e));
1050 Node head(const Edge& e) {
1051 if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])
1052 return Node(this->graph->head(e));
1054 return Node(this->graph->tail(e));
1057 Node aNode(const OutEdgeIt& e) const {
1058 return Node(this->graph->aNode(e.e));
1060 Node aNode(const InEdgeIt& e) const {
1061 return Node(this->graph->aNode(e.e));
1063 Node bNode(const OutEdgeIt& e) const {
1064 return Node(this->graph->bNode(e.e));
1066 Node bNode(const InEdgeIt& e) const {
1067 return Node(this->graph->bNode(e.e));
1070 bool inSClass(const Node& n) const {
1071 return !(*(this->s_false_t_true_map))[n];
1073 bool inTClass(const Node& n) const {
1074 return (*(this->s_false_t_true_map))[n];
1081 /******************** S-T Graph Wrapper ********************/
1087 template<typename Graph> class stGraphWrapper;
1089 template<typename Graph>
1092 operator<<(std::ostream& os,
1093 typename stGraphWrapper<Graph>::Node const& i) {
1094 os << "(node: " << typename Graph::Node(i) << " spec: " << i.spec <<")";
1098 template<typename Graph>
1101 operator<<(std::ostream& os,
1102 typename stGraphWrapper<Graph>::Edge const& i) {
1103 os << "(edge: " << typename Graph::Edge(i) << " spec: " << i.spec
1104 << " node: " << i.n << ")";
1109 /// experimentral, do not try it.
1110 /// It eats a bipartite graph, oriented from S to T.
1111 /// Such one can be made e.g. by the above wrapper.
1112 template<typename Graph>
1113 class stGraphWrapper : public GraphWrapper<Graph> {
1118 //0 normalis, 1 s, 2, true, ez az iteralasi sorrend,
1119 //es a vege a false azaz (invalid, 3)
1121 friend class NodeIt;
1126 //0 normalis, 1 s->vmi, 2 vmi->t, ez a sorrend,
1127 //invalid: (invalid, 3, invalid)
1129 friend class OutEdgeIt;
1131 //normalis pontbol (first, 0, invalid), ..., (invalid, 2, vmi), ... (invalid, 3, invalid)
1132 //s-bol (invalid, 1, first), ... (invalid, 3, invalid)
1133 //t-bol (invalid, 3, invalid)
1135 friend class InEdgeIt;
1137 //normalis pontbol (first, 0, invalid), ..., (invalid, 1, vmi), ... (invalid, 3, invalid)
1138 //s-be (invalid, 3, invalid)
1139 //t-be (invalid, 2, first), ... (invalid, 3, invalid)
1141 friend class EdgeIt;
1142 //(first, 0, invalid) ...
1145 //invalid, 3, invalid)
1146 template <typename T> class NodeMap;
1147 template <typename T, typename Parent> class EdgeMap;
1149 // template <typename T> friend class NodeMap;
1150 // template <typename T> friend class EdgeMap;
1155 static const bool S_CLASS=false;
1156 static const bool T_CLASS=true;
1158 stGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) ,
1160 T_NODE(INVALID, 2) { }
1163 class Node : public Graph::Node {
1165 friend class GraphWrapper<Graph>;
1166 friend class stGraphWrapper<Graph>;
1167 template <typename T> friend class NodeMap;
1169 friend class OutEdgeIt;
1170 friend class InEdgeIt;
1171 friend class EdgeIt;
1175 Node(const typename Graph::Node& _n, int _spec=0) :
1176 Graph::Node(_n), spec(_spec) { }
1177 Node(const Invalid& i) : Graph::Node(i), spec(3) { }
1178 friend bool operator==(const Node& u, const Node& v) {
1179 return (u.spec==v.spec &&
1180 static_cast<typename Graph::Node>(u)==
1181 static_cast<typename Graph::Node>(v));
1183 friend bool operator!=(const Node& u, const Node& v) {
1184 return (v.spec!=u.spec ||
1185 static_cast<typename Graph::Node>(u)!=
1186 static_cast<typename Graph::Node>(v));
1188 friend std::ostream& operator<< <Graph>(std::ostream& os, const Node& i);
1189 int getSpec() const { return spec; }
1193 friend class GraphWrapper<Graph>;
1194 friend class stGraphWrapper<Graph>;
1195 typename Graph::NodeIt n;
1199 NodeIt(const typename Graph::NodeIt& _n, int _spec) :
1200 n(_n), spec(_spec) { }
1201 NodeIt(const Invalid& i) : n(i), spec(3) { }
1202 NodeIt(const stGraphWrapper<Graph>& _G) : n(*(_G.graph)), spec(0) {
1203 if (!_G.graph->valid(n)) spec=1;
1205 operator Node() const { return Node(n, spec); }
1208 typedef NodeIt NodeIt;
1211 class Edge : public Graph::Edge {
1212 friend class GraphWrapper<Graph>;
1213 friend class stGraphWrapper<Graph>;
1214 template <typename T, typename Parent> friend class EdgeMap;
1216 typename Graph::Node n;
1219 Edge(const typename Graph::Edge& _e, int _spec,
1220 const typename Graph::Node& _n) :
1221 Graph::Edge(_e), spec(_spec), n(_n) {
1223 Edge(const Invalid& i) : Graph::Edge(i), spec(3), n(i) { }
1224 friend bool operator==(const Edge& u, const Edge& v) {
1225 return (u.spec==v.spec &&
1226 static_cast<typename Graph::Edge>(u)==
1227 static_cast<typename Graph::Edge>(v) &&
1230 friend bool operator!=(const Edge& u, const Edge& v) {
1231 return (v.spec!=u.spec ||
1232 static_cast<typename Graph::Edge>(u)!=
1233 static_cast<typename Graph::Edge>(v) ||
1236 friend std::ostream& operator<< <Graph>(std::ostream& os, const Edge& i);
1237 int getSpec() const { return spec; }
1241 friend class GraphWrapper<Graph>;
1242 friend class stGraphWrapper<Graph>;
1243 typename Graph::OutEdgeIt e;
1245 typename Graph::ClassNodeIt n;
1248 OutEdgeIt(const typename Graph::OutEdgeIt& _e, int _spec,
1249 const typename Graph::ClassNodeIt& _n) :
1250 e(_e), spec(_spec), n(_n) {
1252 OutEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1253 OutEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) {
1256 if (_G.graph->inSClass(_n)) { //S, van normalis kiel
1257 e=typename Graph::OutEdgeIt(*(_G.graph),
1258 typename Graph::Node(_n));
1261 if (!_G.graph->valid(e)) spec=3;
1262 } else { //T, specko kiel van
1271 _G.graph->first(n, S_CLASS); //s->vmi;
1272 if (!_G.graph->valid(n)) spec=3; //Ha S ures
1281 operator Edge() const { return Edge(e, spec, n); }
1285 friend class GraphWrapper<Graph>;
1286 friend class stGraphWrapper<Graph>;
1287 typename Graph::InEdgeIt e;
1289 typename Graph::ClassNodeIt n;
1292 InEdgeIt(const typename Graph::InEdgeIt& _e, int _spec,
1293 const typename Graph::ClassNodeIt& _n) :
1294 e(_e), spec(_spec), n(_n) {
1296 InEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1297 InEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) {
1300 if (_G.graph->inTClass(_n)) { //T, van normalis beel
1301 e=typename Graph::InEdgeIt(*(_G.graph),
1302 typename Graph::Node(_n));
1305 if (!_G.graph->valid(e)) spec=3;
1306 } else { //S, specko beel van
1320 _G.graph->first(n, T_CLASS); //vmi->t;
1321 if (!_G.graph->valid(n)) spec=3; //Ha T ures
1325 operator Edge() const { return Edge(e, spec, n); }
1329 friend class GraphWrapper<Graph>;
1330 friend class stGraphWrapper<Graph>;
1331 typename Graph::EdgeIt e;
1333 typename Graph::ClassNodeIt n;
1336 EdgeIt(const typename Graph::EdgeIt& _e, int _spec,
1337 const typename Graph::ClassNodeIt& _n) :
1338 e(_e), spec(_spec), n(_n) { }
1339 EdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1340 EdgeIt(const stGraphWrapper<Graph>& _G) :
1341 e(*(_G.graph)), spec(0), n(INVALID) {
1342 if (!_G.graph->valid(e)) {
1344 _G.graph->first(n, S_CLASS);
1345 if (!_G.graph->valid(n)) { //Ha S ures
1347 _G.graph->first(n, T_CLASS);
1348 if (!_G.graph->valid(n)) { //Ha T ures
1354 operator Edge() const { return Edge(e, spec, n); }
1357 NodeIt& first(NodeIt& i) const {
1358 i=NodeIt(*this); return i;
1360 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1361 i=OutEdgeIt(*this, p); return i;
1363 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1364 i=InEdgeIt(*this, p); return i;
1366 EdgeIt& first(EdgeIt& i) const {
1367 i=EdgeIt(*this); return i;
1370 NodeIt& next(NodeIt& i) const {
1373 this->graph->next(i.n);
1374 if (!this->graph->valid(i.n)) {
1387 OutEdgeIt& next(OutEdgeIt& i) const {
1388 typename Graph::Node v;
1390 case 0: //normal edge
1391 v=this->graph->aNode(i.e);
1392 this->graph->next(i.e);
1393 if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk
1394 if (this->graph->inSClass(v)) { //S, nincs kiel
1397 } else { //T, van kiel
1404 this->graph->next(i.n);
1405 if (!this->graph->valid(i.n)) i.spec=3;
1414 InEdgeIt& next(InEdgeIt& i) const {
1415 typename Graph::Node v;
1417 case 0: //normal edge
1418 v=this->graph->aNode(i.e);
1419 this->graph->next(i.e);
1420 if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk
1421 if (this->graph->inTClass(v)) { //S, nincs beel
1424 } else { //S, van beel
1435 this->graph->next(i.n);
1436 if (!this->graph->valid(i.n)) i.spec=3;
1442 EdgeIt& next(EdgeIt& i) const {
1445 this->graph->next(i.e);
1446 if (!this->graph->valid(i.e)) {
1448 this->graph->first(i.n, S_CLASS);
1449 if (!this->graph->valid(i.n)) {
1451 this->graph->first(i.n, T_CLASS);
1452 if (!this->graph->valid(i.n)) i.spec=3;
1457 this->graph->next(i.n);
1458 if (!this->graph->valid(i.n)) {
1460 this->graph->first(i.n, T_CLASS);
1461 if (!this->graph->valid(i.n)) i.spec=3;
1465 this->graph->next(i.n);
1466 if (!this->graph->valid(i.n)) i.spec=3;
1472 Node tail(const Edge& e) const {
1475 return Node(this->graph->tail(e));
1486 Node head(const Edge& e) const {
1489 return Node(this->graph->head(e));
1501 bool valid(const Node& n) const { return (n.spec<3); }
1502 bool valid(const Edge& e) const { return (e.spec<3); }
1504 int nodeNum() const { return this->graph->nodeNum()+2; }
1505 int edgeNum() const {
1506 return this->graph->edgeNum()+this->graph->nodeNum();
1509 Node aNode(const OutEdgeIt& e) const { return tail(e); }
1510 Node aNode(const InEdgeIt& e) const { return head(e); }
1511 Node bNode(const OutEdgeIt& e) const { return head(e); }
1512 Node bNode(const InEdgeIt& e) const { return tail(e); }
1514 void addNode() const { }
1515 void addEdge() const { }
1517 // Node addNode() const { return Node(this->graph->addNode()); }
1518 // Edge addEdge(const Node& tail, const Node& head) const {
1519 // return Edge(this->graph->addEdge(tail, head)); }
1521 // void erase(const Node& i) const { this->graph->erase(i); }
1522 // void erase(const Edge& i) const { this->graph->erase(i); }
1524 // void clear() const { this->graph->clear(); }
1526 template<typename T> class NodeMap : public GraphWrapper<Graph>::template NodeMap<T> {
1527 typedef typename GraphWrapper<Graph>::template NodeMap<T> Parent;
1530 NodeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),
1533 NodeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1536 T operator[](const Node& n) const {
1539 return Parent::operator[](n);
1550 void set(const Node& n, T t) {
1553 GraphWrapper<Graph>::template NodeMap<T>::set(n, t);
1566 template<typename T,
1568 typename GraphWrapper<Graph>::template EdgeMap<T> >
1569 class EdgeMap : public Parent {
1570 //typedef typename GraphWrapper<Graph>::template EdgeMap<T> Parent;
1571 typename GraphWrapper<Graph>::template NodeMap<T> node_value;
1573 EdgeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),
1575 EdgeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1576 node_value(_G, a) { }
1577 T operator[](const Edge& e) const {
1580 return Parent::operator[](e);
1583 return node_value[e.n];
1587 return node_value[e.n];
1591 void set(const Edge& e, T t) {
1597 node_value.set(e.n, t);
1601 node_value.set(e.n, t);
1607 // template<typename T> class EdgeMap : public GraphWrapper<Graph>::template EdgeMap<T> {
1608 // typedef typename GraphWrapper<Graph>::template EdgeMap<T> Parent;
1609 // typename GraphWrapper<Graph>::template NodeMap<T> node_value;
1611 // EdgeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),
1612 // node_value(_G) { }
1613 // EdgeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1614 // node_value(_G, a) { }
1615 // T operator[](const Edge& e) const {
1616 // switch (e.spec) {
1618 // return Parent::operator[](e);
1621 // return node_value[e.n];
1625 // return node_value[e.n];
1629 // void set(const Edge& e, T t) {
1630 // switch (e.spec) {
1632 // GraphWrapper<Graph>::template EdgeMap<T>::set(e, t);
1635 // node_value.set(e.n, t);
1639 // node_value.set(e.n, t);
1652 #endif //HUGO_GRAPH_WRAPPER_H