Changes in the documentation.
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 head(const Edge& e) const {
160 return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
161 Node tail(const Edge& e) const {
162 return Node(graph->tail(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::NodeMap<T> {
188 NodeMap(const GraphWrapper<Graph>& _G) :
189 Graph::NodeMap<T>(*(_G.graph)) { }
190 NodeMap(const GraphWrapper<Graph>& _G, T a) :
191 Graph::NodeMap<T>(*(_G.graph), a) { }
194 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
196 EdgeMap(const GraphWrapper<Graph>& _G) :
197 Graph::EdgeMap<T>(*(_G.graph)) { }
198 EdgeMap(const GraphWrapper<Graph>& _G, T a) :
199 Graph::EdgeMap<T>(*(_G.graph), a) { }
203 /// A graph wrapper which reverses the orientation of the edges.
205 /// A graph wrapper which reverses the orientation of the edges.
206 template<typename Graph>
207 class RevGraphWrapper : public GraphWrapper<Graph> {
210 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
212 typedef typename GraphWrapper<Graph>::Node Node;
213 typedef typename GraphWrapper<Graph>::Edge Edge;
214 //If Graph::OutEdgeIt is not defined
215 //and we do not want to use RevGraphWrapper::InEdgeIt,
216 //the typdef techinque does not work.
217 //Unfortunately all the typedefs are instantiated in templates.
218 //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
219 //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
222 friend class GraphWrapper<Graph>;
223 friend class RevGraphWrapper<Graph>;
224 typename Graph::OutEdgeIt e;
227 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
228 OutEdgeIt(const Invalid& i) : e(i) { }
229 OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
230 e(*(_G.graph), typename Graph::Node(_n)) { }
231 operator Edge() const { return Edge(typename Graph::Edge(e)); }
234 friend class GraphWrapper<Graph>;
235 friend class RevGraphWrapper<Graph>;
236 typename Graph::InEdgeIt e;
239 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
240 InEdgeIt(const Invalid& i) : e(i) { }
241 InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
242 e(*(_G.graph), typename Graph::Node(_n)) { }
243 operator Edge() const { return Edge(typename Graph::Edge(e)); }
246 using GraphWrapper<Graph>::first;
247 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
248 i=OutEdgeIt(*this, p); return i;
250 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
251 i=InEdgeIt(*this, p); return i;
254 using GraphWrapper<Graph>::next;
255 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
256 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
258 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
259 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
260 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
261 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
264 /// Wrapper for hiding nodes and edges from a graph.
266 /// This wrapper shows a graph with filtered node-set and
267 /// edge-set. The quick brown fox iterator jumps over
268 /// the lazy dog nodes or edges if the values for them are false
269 /// in the bool maps.
270 template<typename Graph, typename NodeFilterMap,
271 typename EdgeFilterMap>
272 class SubGraphWrapper : public GraphWrapper<Graph> {
274 NodeFilterMap* node_filter_map;
275 EdgeFilterMap* edge_filter_map;
278 SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
279 EdgeFilterMap& _edge_filter_map) :
280 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
281 edge_filter_map(&_edge_filter_map) { }
283 typedef typename GraphWrapper<Graph>::Node Node;
285 friend class GraphWrapper<Graph>;
286 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
287 typename Graph::NodeIt n;
290 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
291 NodeIt(const Invalid& i) : n(i) { }
292 NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
294 while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])
297 operator Node() const { return Node(typename Graph::Node(n)); }
299 typedef typename GraphWrapper<Graph>::Edge Edge;
301 friend class GraphWrapper<Graph>;
302 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
303 typename Graph::OutEdgeIt e;
306 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
307 OutEdgeIt(const Invalid& i) : e(i) { }
308 OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
310 e(*(_G.graph), typename Graph::Node(_n)) {
311 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
314 operator Edge() const { return Edge(typename Graph::Edge(e)); }
317 friend class GraphWrapper<Graph>;
318 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
319 typename Graph::InEdgeIt e;
322 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
323 InEdgeIt(const Invalid& i) : e(i) { }
324 InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
326 e(*(_G.graph), typename Graph::Node(_n)) {
327 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
330 operator Edge() const { return Edge(typename Graph::Edge(e)); }
332 //typedef typename Graph::SymEdgeIt SymEdgeIt;
334 friend class GraphWrapper<Graph>;
335 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
336 typename Graph::EdgeIt e;
339 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
340 EdgeIt(const Invalid& i) : e(i) { }
341 EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
343 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
346 operator Edge() const { return Edge(typename Graph::Edge(e)); }
349 NodeIt& first(NodeIt& i) const {
350 i=NodeIt(*this); return i;
352 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
353 i=OutEdgeIt(*this, p); return i;
355 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
356 i=InEdgeIt(*this, p); return i;
358 EdgeIt& first(EdgeIt& i) const {
359 i=EdgeIt(*this); return i;
362 NodeIt& next(NodeIt& i) const {
364 while (graph->valid(i) && !(*node_filter_map)[i.n]) { graph->next(i.n); }
367 OutEdgeIt& next(OutEdgeIt& i) const {
369 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
372 InEdgeIt& next(InEdgeIt& i) const {
374 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
377 EdgeIt& next(EdgeIt& i) const {
379 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
383 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
384 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
385 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
386 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
389 ///Some doki, please.
390 void hide(const Node& n) const { node_filter_map->set(n, false); }
392 ///Some doki, please.
393 void hide(const Edge& e) const { edge_filter_map->set(e, false); }
396 ///Some doki, please.
397 void unHide(const Node& n) const { node_filter_map->set(n, true); }
399 ///Some doki, please.
400 void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
403 ///Some doki, please.
404 bool hidden(const Node& n) const { return (*node_filter_map)[n]; }
406 ///Some doki, please.
407 bool hidden(const Edge& e) const { return (*edge_filter_map)[e]; }
410 /// A wrapper for forgetting the orientation of a graph.
412 /// A wrapper for getting an undirected graph by forgetting
413 /// the orientation of a directed one.
414 template<typename Graph>
415 class UndirGraphWrapper : public GraphWrapper<Graph> {
417 typedef typename GraphWrapper<Graph>::Node Node;
418 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
419 typedef typename GraphWrapper<Graph>::Edge Edge;
420 typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
422 UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
425 friend class UndirGraphWrapper<Graph>;
426 bool out_or_in; //true iff out
427 typename Graph::OutEdgeIt out;
428 typename Graph::InEdgeIt in;
431 OutEdgeIt(const Invalid& i) : Edge(i) { }
432 OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
433 out_or_in=true; _G.graph->first(out, _n);
434 if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n); }
436 operator Edge() const {
437 if (out_or_in) return Edge(out); else return Edge(in);
442 typedef OutEdgeIt InEdgeIt;
444 using GraphWrapper<Graph>::first;
445 // NodeIt& first(NodeIt& i) const {
446 // i=NodeIt(*this); return i;
448 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
449 i=OutEdgeIt(*this, p); return i;
452 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
453 // i=InEdgeIt(*this, p); return i;
455 // EdgeIt& first(EdgeIt& i) const {
456 // i=EdgeIt(*this); return i;
459 using GraphWrapper<Graph>::next;
460 // NodeIt& next(NodeIt& n) const {
461 // GraphWrapper<Graph>::next(n);
464 OutEdgeIt& next(OutEdgeIt& e) const {
466 typename Graph::Node n=graph->tail(e.out);
468 if (!graph->valid(e.out)) { e.out_or_in=false; graph->first(e.in, n); }
475 // EdgeIt& next(EdgeIt& e) const {
476 // GraphWrapper<Graph>::next(n);
477 // // graph->next(e.e);
481 Node aNode(const OutEdgeIt& e) const {
482 if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
483 Node bNode(const OutEdgeIt& e) const {
484 if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
487 /// A wrapper for composing the residual graph for directed flow and circulation problems.
489 /// A wrapper for composing the residual graph for directed flow and circulation problems.
490 template<typename Graph, typename Number,
491 typename CapacityMap, typename FlowMap>
492 class ResGraphWrapper : public GraphWrapper<Graph> {
494 const CapacityMap* capacity;
498 ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
500 GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
505 friend class OutEdgeIt;
507 typedef typename GraphWrapper<Graph>::Node Node;
508 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
509 class Edge : public Graph::Edge {
510 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
512 bool forward; //true, iff forward
513 // typename Graph::Edge e;
516 Edge(const typename Graph::Edge& _e, bool _forward) :
517 Graph::Edge(_e), forward(_forward) { }
518 Edge(const Invalid& i) : Graph::Edge(i), forward(false) { }
519 //the unique invalid iterator
520 friend bool operator==(const Edge& u, const Edge& v) {
521 return (v.forward==u.forward &&
522 static_cast<typename Graph::Edge>(u)==
523 static_cast<typename Graph::Edge>(v));
525 friend bool operator!=(const Edge& u, const Edge& v) {
526 return (v.forward!=u.forward ||
527 static_cast<typename Graph::Edge>(u)!=
528 static_cast<typename Graph::Edge>(v));
533 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
535 typename Graph::OutEdgeIt out;
536 typename Graph::InEdgeIt in;
541 // OutEdgeIt(const Edge& e) : Edge(e) { }
542 OutEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
543 //the unique invalid iterator
544 OutEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
546 resG.graph->first(out, v);
547 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
548 if (!resG.graph->valid(out)) {
550 resG.graph->first(in, v);
551 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
554 operator Edge() const {
556 // e.forward=this->forward;
557 // if (this->forward) e=out; else e=in;
560 return Edge(out, this->forward);
562 return Edge(in, this->forward);
567 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
569 typename Graph::OutEdgeIt out;
570 typename Graph::InEdgeIt in;
575 // OutEdgeIt(const Edge& e) : Edge(e) { }
576 InEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
577 //the unique invalid iterator
578 InEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
580 resG.graph->first(in, v);
581 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
582 if (!resG.graph->valid(in)) {
584 resG.graph->first(out, v);
585 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
588 operator Edge() const {
590 // e.forward=this->forward;
591 // if (this->forward) e=out; else e=in;
594 return Edge(in, this->forward);
596 return Edge(out, this->forward);
601 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
603 typename Graph::EdgeIt e;
607 EdgeIt(const Invalid& i) : e(i), forward(false) { }
608 EdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG) {
610 resG.graph->first(e);
611 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
612 if (!resG.graph->valid(e)) {
614 resG.graph->first(e);
615 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
618 operator Edge() const {
619 return Edge(e, this->forward);
623 using GraphWrapper<Graph>::first;
624 // NodeIt& first(NodeIt& i) const {
625 // i=NodeIt(*this); return i;
627 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
628 i=OutEdgeIt(*this, p); return i;
631 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
632 i=InEdgeIt(*this, p); return i;
634 EdgeIt& first(EdgeIt& i) const {
635 i=EdgeIt(*this); return i;
638 using GraphWrapper<Graph>::next;
639 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
640 OutEdgeIt& next(OutEdgeIt& e) const {
642 Node v=graph->aNode(e.out);
644 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
645 if (!graph->valid(e.out)) {
647 graph->first(e.in, v);
648 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
652 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
657 InEdgeIt& next(InEdgeIt& e) const {
659 Node v=graph->aNode(e.in);
661 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
662 if (!graph->valid(e.in)) {
664 graph->first(e.out, v);
665 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
669 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
673 EdgeIt& next(EdgeIt& e) const {
676 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
677 if (!graph->valid(e.e)) {
680 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
684 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
689 Node tail(Edge e) const {
690 return ((e.forward) ? graph->tail(e) : graph->head(e)); }
691 Node head(Edge e) const {
692 return ((e.forward) ? graph->head(e) : graph->tail(e)); }
694 Node aNode(OutEdgeIt e) const {
695 return ((e.forward) ? graph->aNode(e.out) : graph->aNode(e.in)); }
696 Node bNode(OutEdgeIt e) const {
697 return ((e.forward) ? graph->bNode(e.out) : graph->bNode(e.in)); }
699 // int nodeNum() const { return graph->nodeNum(); }
701 void edgeNum() const { }
702 //int edgeNum() const { return graph->edgeNum(); }
705 // int id(Node v) const { return graph->id(v); }
707 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
708 bool valid(Edge e) const {
709 return graph->valid(e);
710 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
713 void augment(const Edge& e, Number a) const {
715 // flow->set(e.out, flow->get(e.out)+a);
716 flow->set(e, (*flow)[e]+a);
718 // flow->set(e.in, flow->get(e.in)-a);
719 flow->set(e, (*flow)[e]-a);
722 Number resCap(const Edge& e) const {
724 // return (capacity->get(e.out)-flow->get(e.out));
725 return ((*capacity)[e]-(*flow)[e]);
727 // return (flow->get(e.in));
731 // Number resCap(typename Graph::OutEdgeIt out) const {
732 // // return (capacity->get(out)-flow->get(out));
733 // return ((*capacity)[out]-(*flow)[out]);
736 // Number resCap(typename Graph::InEdgeIt in) const {
737 // // return (flow->get(in));
738 // return ((*flow)[in]);
741 template <typename T>
743 typename Graph::EdgeMap<T> forward_map, backward_map;
745 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
746 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
747 void set(Edge e, T a) {
749 forward_map.set(e.out, a);
751 backward_map.set(e.in, a);
753 T operator[](Edge e) const {
755 return forward_map[e.out];
757 return backward_map[e.in];
759 // T get(Edge e) const {
761 // return forward_map.get(e.out);
763 // return backward_map.get(e.in);
768 /// ErasingFirstGraphWrapper for blocking flows.
770 /// ErasingFirstGraphWrapper for blocking flows.
771 template<typename Graph, typename FirstOutEdgesMap>
772 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
774 FirstOutEdgesMap* first_out_edges;
776 ErasingFirstGraphWrapper(Graph& _graph,
777 FirstOutEdgesMap& _first_out_edges) :
778 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
780 typedef typename GraphWrapper<Graph>::Node Node;
782 // friend class GraphWrapper<Graph>;
783 // friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
784 // typename Graph::NodeIt n;
787 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
788 // NodeIt(const Invalid& i) : n(i) { }
789 // NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
790 // n(*(_G.graph)) { }
791 // operator Node() const { return Node(typename Graph::Node(n)); }
793 typedef typename GraphWrapper<Graph>::Edge Edge;
795 friend class GraphWrapper<Graph>;
796 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
797 // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
798 typename Graph::OutEdgeIt e;
801 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
802 OutEdgeIt(const Invalid& i) : e(i) { }
803 OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
805 e((*_G.first_out_edges)[_n]) { }
806 operator Edge() const { return Edge(typename Graph::Edge(e)); }
809 friend class GraphWrapper<Graph>;
810 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
811 // typedef typename Graph::InEdgeIt GraphInEdgeIt;
812 typename Graph::InEdgeIt e;
815 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
816 InEdgeIt(const Invalid& i) : e(i) { }
817 InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
819 e(*(_G.graph), typename Graph::Node(_n)) { }
820 operator Edge() const { return Edge(typename Graph::Edge(e)); }
822 //typedef typename Graph::SymEdgeIt SymEdgeIt;
824 friend class GraphWrapper<Graph>;
825 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
826 // typedef typename Graph::EdgeIt GraphEdgeIt;
827 typename Graph::EdgeIt e;
830 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
831 EdgeIt(const Invalid& i) : e(i) { }
832 EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
834 operator Edge() const { return Edge(typename Graph::Edge(e)); }
837 using GraphWrapper<Graph>::first;
838 // NodeIt& first(NodeIt& i) const {
839 // i=NodeIt(*this); return i;
841 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
842 i=OutEdgeIt(*this, p); return i;
844 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
845 i=InEdgeIt(*this, p); return i;
847 EdgeIt& first(EdgeIt& i) const {
848 i=EdgeIt(*this); return i;
851 using GraphWrapper<Graph>::next;
852 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
853 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
854 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
855 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
857 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
858 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
859 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
860 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
862 void erase(const OutEdgeIt& e) const {
865 first_out_edges->set(this->tail(e), f.e);
869 /// A wrapper for composing a bipartite graph.
870 /// \c _graph have to be a reference to a graph of type \c Graph
871 /// and \c _s_false_t_true_map is an \c IterableBoolMap
872 /// reference containing the elements for the
873 /// color classes S and T. \c _graph is to be referred to an undirected
874 /// graph or a directed graph with edges oriented from S to T.
875 template<typename Graph>
876 class BipartiteGraphWrapper : public GraphWrapper<Graph> {
877 typedef IterableBoolMap< typename Graph::NodeMap<int> > SFalseTTrueMap;
878 SFalseTTrueMap* s_false_t_true_map;
881 BipartiteGraphWrapper(Graph& _graph, SFalseTTrueMap& _s_false_t_true_map)
882 : GraphWrapper<Graph>(_graph), s_false_t_true_map(&_s_false_t_true_map) {
884 typedef typename GraphWrapper<Graph>::Node Node;
885 //using GraphWrapper<Graph>::NodeIt;
886 typedef typename GraphWrapper<Graph>::Edge Edge;
887 //using GraphWrapper<Graph>::EdgeIt;
892 SNodeIt(const Invalid& i) : n(i) { }
893 SNodeIt(const BipartiteGraphWrapper<Graph>& _G) {
894 _G.s_false_t_true_map->first(n, false);
896 operator Node() const { return n; }
902 TNodeIt(const Invalid& i) : n(i) { }
903 TNodeIt(const BipartiteGraphWrapper<Graph>& _G) {
904 _G.s_false_t_true_map->first(n, true);
906 operator Node() const { return n; }
910 typename Graph::OutEdgeIt e;
913 OutEdgeIt(const Invalid& i) : e(i) { }
914 OutEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) {
915 if (!(*(_G.s_false_t_true_map))[_n])
916 e=OutEdgeIt(*(_G.graph), typename Graph::Node(_n));
920 operator Edge() const { return Edge(typename Graph::Edge(e)); }
924 typename Graph::InEdgeIt e;
927 InEdgeIt(const Invalid& i) : e(i) { }
928 InEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) {
929 if ((*(_G.s_false_t_true_map))[_n])
930 e=InEdgeIt(*(_G.graph), typename Graph::Node(_n));
934 operator Edge() const { return Edge(typename Graph::Edge(e)); }
937 using GraphWrapper<Graph>::first;
938 SNodeIt& first(SNodeIt& n) const { n=SNodeIt(*this); return n; }
939 TNodeIt& first(TNodeIt& n) const { n=TNodeIt(*this); return n; }
941 using GraphWrapper<Graph>::next;
942 SNodeIt& next(SNodeIt& n) const {
943 this->s_false_t_true_map->next(n); return n;
945 TNodeIt& next(TNodeIt& n) const {
946 this->s_false_t_true_map->next(n); return n;
949 Node tail(const Edge& e) {
950 if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])
951 return Node(this->graph->tail(e));
953 return Node(this->graph->head(e));
955 Node head(const Edge& e) {
956 if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])
957 return Node(this->graph->head(e));
959 return Node(this->graph->tail(e));
962 Node aNode(const OutEdgeIt& e) const {
963 return Node(this->graph->aNode(e.e));
965 Node aNode(const InEdgeIt& e) const {
966 return Node(this->graph->aNode(e.e));
968 Node bNode(const OutEdgeIt& e) const {
969 return Node(this->graph->bNode(e.e));
971 Node bNode(const InEdgeIt& e) const {
972 return Node(this->graph->bNode(e.e));
978 // /// experimentral, do not try it.
979 // template<typename Graph>
980 // class stGraphWrapper : public GraphWrapper<Graph> {
992 // stGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph),
993 // s(INVALID, 1), t(INVALID, 2) { }
995 // class Node : public Graph::Node {
996 // friend class GraphWrapper<Graph>;
997 // friend class stGraphWrapper<Graph>;
999 // int spec; //0 if real node, 1 iff s, 2 iff t
1002 // Node(const typename Graph::Node& _n, int _spec=0) :
1003 // Graph::Node(_n), spec(_spec) { }
1004 // Node(const Invalid& i) : Graph::Node(i), spec(2) { }
1005 // //invalid: (invalid, 2);
1009 // friend class GraphWrapper<Graph>;
1010 // friend class stGraphWrapper<Graph>;
1011 // typename Graph::NodeIt n;
1015 // NodeIt(const typename Graph::NodeIt& _n, int _spec=0) :
1016 // n(_n), spec(_spec) { }
1017 // NodeIt(const Invalid& i) : n(i), spec(2) { }
1018 // NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)), spec(0) {
1019 // if (!_G->valid(n)) spec=1;
1021 // operator Node() const { return Node(n, spec); }
1023 // // typedef typename Graph::Edge Edge;
1024 // class Edge : public Graph::Edge {
1025 // friend class GraphWrapper<Graph>;
1026 // friend class stGraphWrapper<Graph>;
1031 // Edge(const typename Graph::Edge& _e) :
1032 // Graph::Edge(_e), tail_spec(i, 0), head_spec(i, 0) {
1033 // //a tail-t es a head-et real node-ra csinaljuk
1035 // Edge(const Invalid& i) : Graph::Edge(i), tail_spec(i), head_spec(i) { }
1037 // class OutEdgeIt {
1038 // friend class GraphWrapper<Graph>;
1039 // friend class stGraphWrapper<Graph>;
1040 // typename Graph::OutEdgeIt e;
1045 // OutEdgeIt(const typename Graph::OutEdgeIt& _e) :
1046 // e(_e), tail_spec(i, 0), head_spec(i, 0) {
1047 // //a tail-t es a head-et real node-ra csinaljuk
1049 // OutEdgeIt(const Invalid& i) : e(i), tail_spec(i), head_spec(i) { }
1050 // //invalid: (barmi, 0, 2)
1051 // OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) {
1052 // switch (_n.spec) {
1054 // e=typename Graph::OutEdgeIt(*(_G.graph), typename Graph::Node(_n));
1057 // if (!_G.graph->valid(e)) spec=1;
1062 // _head(_G.graph->first(typename Graph::NodeIt()));
1068 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
1071 // friend class GraphWrapper<Graph>;
1072 // typename Graph::InEdgeIt e;
1075 // InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
1076 // InEdgeIt(const Invalid& i) : e(i) { }
1077 // InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
1078 // e(*(_G.graph), typename Graph::Node(_n)) { }
1079 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
1081 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
1083 // friend class GraphWrapper<Graph>;
1084 // typename Graph::EdgeIt e;
1087 // EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
1088 // EdgeIt(const Invalid& i) : e(i) { }
1089 // EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
1090 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
1093 // NodeIt& first(NodeIt& i) const {
1094 // i=NodeIt(*this); return i;
1096 // OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1097 // i=OutEdgeIt(*this, p); return i;
1099 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1100 // i=InEdgeIt(*this, p); return i;
1102 // EdgeIt& first(EdgeIt& i) const {
1103 // i=EdgeIt(*this); return i;
1106 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
1107 // OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
1108 // InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
1109 // EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
1111 // Node head(const Edge& e) const {
1112 // return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
1113 // Node tail(const Edge& e) const {
1114 // return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
1116 // bool valid(const Node& n) const {
1117 // return graph->valid(static_cast<typename Graph::Node>(n)); }
1118 // bool valid(const Edge& e) const {
1119 // return graph->valid(static_cast<typename Graph::Edge>(e)); }
1121 // int nodeNum() const { return graph->nodeNum(); }
1122 // int edgeNum() const { return graph->edgeNum(); }
1124 // Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
1125 // Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
1126 // Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
1127 // Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
1129 // Node addNode() const { return Node(graph->addNode()); }
1130 // Edge addEdge(const Node& tail, const Node& head) const {
1131 // return Edge(graph->addEdge(tail, head)); }
1133 // void erase(const Node& i) const { graph->erase(i); }
1134 // void erase(const Edge& i) const { graph->erase(i); }
1136 // void clear() const { graph->clear(); }
1138 // template<typename T> class NodeMap : public Graph::NodeMap<T> {
1140 // NodeMap(const GraphWrapper<Graph>& _G) :
1141 // Graph::NodeMap<T>(*(_G.graph)) { }
1142 // NodeMap(const GraphWrapper<Graph>& _G, T a) :
1143 // Graph::NodeMap<T>(*(_G.graph), a) { }
1146 // template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1148 // EdgeMap(const GraphWrapper<Graph>& _G) :
1149 // Graph::EdgeMap<T>(*(_G.graph)) { }
1150 // EdgeMap(const GraphWrapper<Graph>& _G, T a) :
1151 // Graph::EdgeMap<T>(*(_G.graph), a) { }
1157 #endif //HUGO_GRAPH_WRAPPER_H