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];
1078 template<typename Graph>
1079 class stGraphWrapper;
1081 // template<typename Graph>
1083 // operator<<(std::ostream& os, const typename stGraphWrapper<Graph>::Node& i) {
1084 // os << "(node: " << typename Graph::Node(i) << " spec: " << i.spec <<")";
1087 // template<typename Graph>
1089 // operator<<(std::ostream& os, const typename stGraphWrapper<Graph>::Edge& i) {
1090 // os << "(edge: " << typename Graph::Edge(i) << " spec: " << i.spec <<
1091 // " node: " << i.n << ")";
1095 /// experimentral, do not try it.
1096 /// It eats a bipartite graph, oriented from S to T.
1097 /// Such one can be made e.g. by the above wrapper.
1098 template<typename Graph>
1099 class stGraphWrapper : public GraphWrapper<Graph> {
1104 //0 normalis, 1 s, 2, true, ez az iteralasi sorrend,
1105 //es a vege a false azaz (invalid, 3)
1107 friend class NodeIt;
1112 //0 normalis, 1 s->vmi, 2 vmi->t, ez a sorrend,
1113 //invalid: (invalid, 3, invalid)
1115 friend class OutEdgeIt;
1117 //normalis pontbol (first, 0, invalid), ..., (invalid, 2, vmi), ... (invalid, 3, invalid)
1118 //s-bol (invalid, 1, first), ... (invalid, 3, invalid)
1119 //t-bol (invalid, 3, invalid)
1121 friend class InEdgeIt;
1123 //normalis pontbol (first, 0, invalid), ..., (invalid, 1, vmi), ... (invalid, 3, invalid)
1124 //s-be (invalid, 3, invalid)
1125 //t-be (invalid, 2, first), ... (invalid, 3, invalid)
1127 friend class EdgeIt;
1128 //(first, 0, invalid) ...
1131 //invalid, 3, invalid)
1132 template <typename T> class NodeMap;
1133 template <typename T, typename Parent> class EdgeMap;
1135 // template <typename T> friend class NodeMap;
1136 // template <typename T> friend class EdgeMap;
1141 static const bool S_CLASS=false;
1142 static const bool T_CLASS=true;
1144 stGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) ,
1146 T_NODE(INVALID, 2) { }
1150 // operator<<(std::ostream& os, const /*typename stGraphWrapper<Graph>::*/Node& i);
1151 // friend std::ostream&
1152 // operator<<(std::ostream& os, const /*typename stGraphWrapper<Graph>::*/Node& i);
1153 // friend std::ostream&
1154 // operator<<(std::ostream& os, const /*typename stGraphWrapper<Graph>::*/Edge& i);
1156 class Node : public Graph::Node {
1158 friend class GraphWrapper<Graph>;
1159 friend class stGraphWrapper<Graph>;
1160 template <typename T> friend class NodeMap;
1162 friend class OutEdgeIt;
1163 friend class InEdgeIt;
1164 friend class EdgeIt;
1168 Node(const typename Graph::Node& _n, int _spec=0) :
1169 Graph::Node(_n), spec(_spec) { }
1170 Node(const Invalid& i) : Graph::Node(i), spec(3) { }
1171 friend bool operator==(const Node& u, const Node& v) {
1172 return (u.spec==v.spec &&
1173 static_cast<typename Graph::Node>(u)==
1174 static_cast<typename Graph::Node>(v));
1176 friend bool operator!=(const Node& u, const Node& v) {
1177 return (v.spec!=u.spec ||
1178 static_cast<typename Graph::Node>(u)!=
1179 static_cast<typename Graph::Node>(v));
1181 // template<typename G>
1182 // friend std::ostream&
1183 // operator<<(std::ostream& os, const typename stGraphWrapper<G>::Node& i);
1184 friend std::ostream& operator<< (std::ostream& os, const Node& i);
1185 int getSpec() const { return spec; }
1189 friend class GraphWrapper<Graph>;
1190 friend class stGraphWrapper<Graph>;
1191 typename Graph::NodeIt n;
1195 NodeIt(const typename Graph::NodeIt& _n, int _spec) :
1196 n(_n), spec(_spec) { }
1197 NodeIt(const Invalid& i) : n(i), spec(3) { }
1198 NodeIt(const stGraphWrapper<Graph>& _G) : n(*(_G.graph)), spec(0) {
1199 if (!_G.graph->valid(n)) spec=1;
1201 operator Node() const { return Node(n, spec); }
1204 class Edge : public Graph::Edge {
1205 friend class GraphWrapper<Graph>;
1206 friend class stGraphWrapper<Graph>;
1207 template <typename T, typename Parent> friend class EdgeMap;
1209 typename Graph::Node n;
1212 Edge(const typename Graph::Edge& _e, int _spec,
1213 const typename Graph::Node& _n) :
1214 Graph::Edge(_e), spec(_spec), n(_n) {
1216 Edge(const Invalid& i) : Graph::Edge(i), spec(3), n(i) { }
1217 friend bool operator==(const Edge& u, const Edge& v) {
1218 return (u.spec==v.spec &&
1219 static_cast<typename Graph::Edge>(u)==
1220 static_cast<typename Graph::Edge>(v) &&
1223 friend bool operator!=(const Edge& u, const Edge& v) {
1224 return (v.spec!=u.spec ||
1225 static_cast<typename Graph::Edge>(u)!=
1226 static_cast<typename Graph::Edge>(v) ||
1229 // template<typename G>
1230 // friend std::ostream&
1231 // operator<<(std::ostream& os, const typename stGraphWrapper<G>::Edge& i);
1232 friend std::ostream& operator<< (std::ostream& os, const Edge& i);
1233 int getSpec() const { return spec; }
1237 friend class GraphWrapper<Graph>;
1238 friend class stGraphWrapper<Graph>;
1239 typename Graph::OutEdgeIt e;
1241 typename Graph::ClassNodeIt n;
1244 OutEdgeIt(const typename Graph::OutEdgeIt& _e, int _spec,
1245 const typename Graph::ClassNodeIt& _n) :
1246 e(_e), spec(_spec), n(_n) {
1248 OutEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1249 OutEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) {
1252 if (_G.graph->inSClass(_n)) { //S, van normalis kiel
1253 e=typename Graph::OutEdgeIt(*(_G.graph),
1254 typename Graph::Node(_n));
1257 if (!_G.graph->valid(e)) spec=3;
1258 } else { //T, specko kiel van
1267 _G.graph->first(n, S_CLASS); //s->vmi;
1268 if (!_G.graph->valid(n)) spec=3; //Ha S ures
1277 operator Edge() const { return Edge(e, spec, n); }
1281 friend class GraphWrapper<Graph>;
1282 friend class stGraphWrapper<Graph>;
1283 typename Graph::InEdgeIt e;
1285 typename Graph::ClassNodeIt n;
1288 InEdgeIt(const typename Graph::InEdgeIt& _e, int _spec,
1289 const typename Graph::ClassNodeIt& _n) :
1290 e(_e), spec(_spec), n(_n) {
1292 InEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1293 InEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) {
1296 if (_G.graph->inTClass(_n)) { //T, van normalis beel
1297 e=typename Graph::InEdgeIt(*(_G.graph),
1298 typename Graph::Node(_n));
1301 if (!_G.graph->valid(e)) spec=3;
1302 } else { //S, specko beel van
1316 _G.graph->first(n, T_CLASS); //vmi->t;
1317 if (!_G.graph->valid(n)) spec=3; //Ha T ures
1321 operator Edge() const { return Edge(e, spec, n); }
1325 friend class GraphWrapper<Graph>;
1326 friend class stGraphWrapper<Graph>;
1327 typename Graph::EdgeIt e;
1329 typename Graph::ClassNodeIt n;
1332 EdgeIt(const typename Graph::EdgeIt& _e, int _spec,
1333 const typename Graph::ClassNodeIt& _n) :
1334 e(_e), spec(_spec), n(_n) { }
1335 EdgeIt(const Invalid& i) : e(i), spec(3), n(i) { }
1336 EdgeIt(const stGraphWrapper<Graph>& _G) :
1337 e(*(_G.graph)), spec(0), n(INVALID) {
1338 if (!_G.graph->valid(e)) {
1340 _G.graph->first(n, S_CLASS);
1341 if (!_G.graph->valid(n)) { //Ha S ures
1343 _G.graph->first(n, T_CLASS);
1344 if (!_G.graph->valid(n)) { //Ha T ures
1350 operator Edge() const { return Edge(e, spec, n); }
1353 NodeIt& first(NodeIt& i) const {
1354 i=NodeIt(*this); return i;
1356 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1357 i=OutEdgeIt(*this, p); return i;
1359 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1360 i=InEdgeIt(*this, p); return i;
1362 EdgeIt& first(EdgeIt& i) const {
1363 i=EdgeIt(*this); return i;
1366 NodeIt& next(NodeIt& i) const {
1369 this->graph->next(i.n);
1370 if (!this->graph->valid(i.n)) {
1383 OutEdgeIt& next(OutEdgeIt& i) const {
1384 typename Graph::Node v;
1386 case 0: //normal edge
1387 v=this->graph->aNode(i.e);
1388 this->graph->next(i.e);
1389 if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk
1390 if (this->graph->inSClass(v)) { //S, nincs kiel
1393 } else { //T, van kiel
1400 this->graph->next(i.n);
1401 if (!this->graph->valid(i.n)) i.spec=3;
1410 InEdgeIt& next(InEdgeIt& i) const {
1411 typename Graph::Node v;
1413 case 0: //normal edge
1414 v=this->graph->aNode(i.e);
1415 this->graph->next(i.e);
1416 if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk
1417 if (this->graph->inTClass(v)) { //S, nincs beel
1420 } else { //S, van beel
1431 this->graph->next(i.n);
1432 if (!this->graph->valid(i.n)) i.spec=3;
1438 EdgeIt& next(EdgeIt& i) const {
1441 this->graph->next(i.e);
1442 if (!this->graph->valid(i.e)) {
1444 this->graph->first(i.n, S_CLASS);
1445 if (!this->graph->valid(i.n)) {
1447 this->graph->first(i.n, T_CLASS);
1448 if (!this->graph->valid(i.n)) i.spec=3;
1453 this->graph->next(i.n);
1454 if (!this->graph->valid(i.n)) {
1456 this->graph->first(i.n, T_CLASS);
1457 if (!this->graph->valid(i.n)) i.spec=3;
1461 this->graph->next(i.n);
1462 if (!this->graph->valid(i.n)) i.spec=3;
1468 Node tail(const Edge& e) const {
1471 return Node(this->graph->tail(e));
1482 Node head(const Edge& e) const {
1485 return Node(this->graph->head(e));
1497 bool valid(const Node& n) const { return (n.spec<3); }
1498 bool valid(const Edge& e) const { return (e.spec<3); }
1500 int nodeNum() const { return this->graph->nodeNum()+2; }
1501 int edgeNum() const {
1502 return this->graph->edgeNum()+this->graph->nodeNum();
1505 Node aNode(const OutEdgeIt& e) const { return tail(e); }
1506 Node aNode(const InEdgeIt& e) const { return head(e); }
1507 Node bNode(const OutEdgeIt& e) const { return head(e); }
1508 Node bNode(const InEdgeIt& e) const { return tail(e); }
1510 void addNode() const { }
1511 void addEdge() const { }
1513 // Node addNode() const { return Node(this->graph->addNode()); }
1514 // Edge addEdge(const Node& tail, const Node& head) const {
1515 // return Edge(this->graph->addEdge(tail, head)); }
1517 // void erase(const Node& i) const { this->graph->erase(i); }
1518 // void erase(const Edge& i) const { this->graph->erase(i); }
1520 // void clear() const { this->graph->clear(); }
1522 template<typename T> class NodeMap : public GraphWrapper<Graph>::template NodeMap<T> {
1523 typedef typename GraphWrapper<Graph>::template NodeMap<T> Parent;
1526 NodeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),
1529 NodeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1532 T operator[](const Node& n) const {
1535 return Parent::operator[](n);
1546 void set(const Node& n, T t) {
1549 GraphWrapper<Graph>::template NodeMap<T>::set(n, t);
1562 template<typename T,
1564 typename GraphWrapper<Graph>::template EdgeMap<T> >
1565 class EdgeMap : public Parent {
1566 //typedef typename GraphWrapper<Graph>::template EdgeMap<T> Parent;
1567 typename GraphWrapper<Graph>::template NodeMap<T> node_value;
1569 EdgeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),
1571 EdgeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1572 node_value(_G, a) { }
1573 T operator[](const Edge& e) const {
1576 return Parent::operator[](e);
1579 return node_value[e.n];
1583 return node_value[e.n];
1587 void set(const Edge& e, T t) {
1593 node_value.set(e.n, t);
1597 node_value.set(e.n, t);
1603 // template<typename T> class EdgeMap : public GraphWrapper<Graph>::template EdgeMap<T> {
1604 // typedef typename GraphWrapper<Graph>::template EdgeMap<T> Parent;
1605 // typename GraphWrapper<Graph>::template NodeMap<T> node_value;
1607 // EdgeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),
1608 // node_value(_G) { }
1609 // EdgeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),
1610 // node_value(_G, a) { }
1611 // T operator[](const Edge& e) const {
1612 // switch (e.spec) {
1614 // return Parent::operator[](e);
1617 // return node_value[e.n];
1621 // return node_value[e.n];
1625 // void set(const Edge& e, T t) {
1626 // switch (e.spec) {
1628 // GraphWrapper<Graph>::template EdgeMap<T>::set(e, t);
1631 // node_value.set(e.n, t);
1635 // node_value.set(e.n, t);
1641 // template<typename G>
1642 friend std::ostream&
1643 operator<<(std::ostream& os, const /*typename stGraphWrapper<Graph>::*/Node& i) {
1644 os << "(node: " << typename Graph::Node(i) << " spec: " << i.spec <<")";
1647 // template<typename G>
1648 friend std::ostream&
1649 operator<<(std::ostream& os, const /*typename stGraphWrapper<Graph>::*/Edge& i) {
1650 os << "(edge: " << typename Graph::Edge(i) << " spec: " << i.spec <<
1651 " node: " << i.n << ")";
1662 #endif //HUGO_GRAPH_WRAPPER_H