2 #ifndef HUGO_GRAPH_WRAPPER_H
3 #define HUGO_GRAPH_WRAPPER_H
11 /// A main parts of HUGOlib are the different graph structures,
12 /// generic graph algorithms, graph concepts which couple these, and
13 /// graph wrappers. While the previous ones are more or less clear, the
14 /// latter notion needs further explanation.
15 /// Graph wrappers are graph classes which serve for considering graph
16 /// structures in different ways. A short example makes the notion much
18 /// Suppose that we have an instance \c g of a directed graph
19 /// type say \c ListGraph and an algorithm
20 /// \code template<typename Graph> int algorithm(const Graph&); \endcode
21 /// is needed to run on the reversely oriented graph.
22 /// It may be expensive (in time or in memory usage) to copy
23 /// \c g with the reverse orientation.
24 /// Thus, a wrapper class
25 /// \code template<typename Graph> class RevGraphWrapper; \endcode is used.
26 /// The code looks as follows
29 /// RevGraphWrapper<ListGraph> rgw(g);
30 /// int result=algorithm(rgw);
32 /// After running the algorithm, the original graph \c g
33 /// remains untouched. Thus the graph wrapper used above is to consider the
34 /// original graph with reverse orientation.
35 /// This techniques gives rise to an elegant code, and
36 /// based on stable graph wrappers, complex algorithms can be
37 /// implemented easily.
38 /// In flow, circulation and bipartite matching problems, the residual
39 /// graph is of particular importance. Combining a wrapper implementing
40 /// this, shortest path algorithms and minimum mean cycle algorithms,
41 /// a range of weighted and cardinality optimization algorithms can be
42 /// obtained. For lack of space, for other examples,
43 /// the interested user is referred to the detailed documentation of graph
45 /// The behavior of graph wrappers can be very different. Some of them keep
46 /// capabilities of the original graph while in other cases this would be
47 /// meaningless. This means that the concepts that they are a model of depend
48 /// on the graph wrapper, and the wrapped graph(s).
49 /// If an edge of \c rgw is deleted, this is carried out by
50 /// deleting the corresponding edge of \c g. But for a residual
51 /// graph, this operation has no sense.
52 /// Let we stand one more example here to simplify your work.
54 /// \code template<typename Graph> class RevGraphWrapper; \endcode
56 /// <tt> RevGraphWrapper(Graph& _g)</tt>.
57 /// This means that in a situation,
58 /// when a <tt> const ListGraph& </tt> reference to a graph is given,
59 /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
61 /// int algorithm1(const ListGraph& g) {
62 /// RevGraphWrapper<const ListGraph> rgw(g);
63 /// return algorithm2(rgw);
66 template<typename Graph>
72 typedef Graph BaseGraph;
73 typedef Graph ParentGraph;
75 // GraphWrapper() : graph(0) { }
76 GraphWrapper(Graph& _graph) : graph(&_graph) { }
77 // void setGraph(Graph& _graph) { graph=&_graph; }
78 // Graph& getGraph() const { return *graph; }
80 // typedef typename Graph::Node Node;
81 class Node : public Graph::Node {
82 friend class GraphWrapper<Graph>;
85 Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
86 Node(const Invalid& i) : Graph::Node(i) { }
89 friend class GraphWrapper<Graph>;
90 typename Graph::NodeIt n;
93 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
94 NodeIt(const Invalid& i) : n(i) { }
95 NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { }
96 operator Node() const { return Node(typename Graph::Node(n)); }
98 // typedef typename Graph::Edge Edge;
99 class Edge : public Graph::Edge {
100 friend class GraphWrapper<Graph>;
103 Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
104 Edge(const Invalid& i) : Graph::Edge(i) { }
107 friend class GraphWrapper<Graph>;
108 typename Graph::OutEdgeIt e;
111 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
112 OutEdgeIt(const Invalid& i) : e(i) { }
113 OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
114 e(*(_G.graph), typename Graph::Node(_n)) { }
115 operator Edge() const { return Edge(typename Graph::Edge(e)); }
118 friend class GraphWrapper<Graph>;
119 typename Graph::InEdgeIt e;
122 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
123 InEdgeIt(const Invalid& i) : e(i) { }
124 InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
125 e(*(_G.graph), typename Graph::Node(_n)) { }
126 operator Edge() const { return Edge(typename Graph::Edge(e)); }
128 //typedef typename Graph::SymEdgeIt SymEdgeIt;
130 friend class GraphWrapper<Graph>;
131 typename Graph::EdgeIt e;
134 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
135 EdgeIt(const Invalid& i) : e(i) { }
136 EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
137 operator Edge() const { return Edge(typename Graph::Edge(e)); }
140 NodeIt& first(NodeIt& i) const {
141 i=NodeIt(*this); return i;
143 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
144 i=OutEdgeIt(*this, p); return i;
146 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
147 i=InEdgeIt(*this, p); return i;
149 EdgeIt& first(EdgeIt& i) const {
150 i=EdgeIt(*this); return i;
153 NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
154 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
155 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
156 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
158 Node head(const Edge& e) const {
159 return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
160 Node tail(const Edge& e) const {
161 return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
163 bool valid(const Node& n) const {
164 return graph->valid(static_cast<typename Graph::Node>(n)); }
165 bool valid(const Edge& e) const {
166 return graph->valid(static_cast<typename Graph::Edge>(e)); }
168 int nodeNum() const { return graph->nodeNum(); }
169 int edgeNum() const { return graph->edgeNum(); }
171 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
172 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
173 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
174 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
176 Node addNode() const { return Node(graph->addNode()); }
177 Edge addEdge(const Node& tail, const Node& head) const {
178 return Edge(graph->addEdge(tail, head)); }
180 void erase(const Node& i) const { graph->erase(i); }
181 void erase(const Edge& i) const { graph->erase(i); }
183 void clear() const { graph->clear(); }
185 template<typename T> class NodeMap : public Graph::NodeMap<T> {
187 NodeMap(const GraphWrapper<Graph>& _G) :
188 Graph::NodeMap<T>(*(_G.graph)) { }
189 NodeMap(const GraphWrapper<Graph>& _G, T a) :
190 Graph::NodeMap<T>(*(_G.graph), a) { }
193 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
195 EdgeMap(const GraphWrapper<Graph>& _G) :
196 Graph::EdgeMap<T>(*(_G.graph)) { }
197 EdgeMap(const GraphWrapper<Graph>& _G, T a) :
198 Graph::EdgeMap<T>(*(_G.graph), a) { }
202 /// A graph wrapper which reverses the orientation of the edges.
204 /// A graph wrapper which reverses the orientation of the edges.
205 template<typename Graph>
206 class RevGraphWrapper : public GraphWrapper<Graph> {
209 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
211 typedef typename GraphWrapper<Graph>::Node Node;
212 typedef typename GraphWrapper<Graph>::Edge Edge;
213 //If Graph::OutEdgeIt is not defined
214 //and we do not want to use RevGraphWrapper::InEdgeIt,
215 //the typdef techinque does not work.
216 //Unfortunately all the typedefs are instantiated in templates.
217 //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
218 //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
221 friend class GraphWrapper<Graph>;
222 friend class RevGraphWrapper<Graph>;
223 typename Graph::OutEdgeIt e;
226 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
227 OutEdgeIt(const Invalid& i) : e(i) { }
228 OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
229 e(*(_G.graph), typename Graph::Node(_n)) { }
230 operator Edge() const { return Edge(typename Graph::Edge(e)); }
233 friend class GraphWrapper<Graph>;
234 friend class RevGraphWrapper<Graph>;
235 typename Graph::InEdgeIt e;
238 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
239 InEdgeIt(const Invalid& i) : e(i) { }
240 InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
241 e(*(_G.graph), typename Graph::Node(_n)) { }
242 operator Edge() const { return Edge(typename Graph::Edge(e)); }
245 using GraphWrapper<Graph>::first;
246 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
247 i=OutEdgeIt(*this, p); return i;
249 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
250 i=InEdgeIt(*this, p); return i;
253 using GraphWrapper<Graph>::next;
254 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
255 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
257 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
258 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
259 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
260 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
263 /// Wrapper for hiding nodes and edges from a graph.
265 /// This wrapper shows a graph with filtered node-set and
266 /// edge-set. The quick brown fox iterators jumps over
267 /// the lazy dog nodes or edges if the values for them are false
268 /// in the bool maps.
269 template<typename Graph, typename NodeFilterMap,
270 typename EdgeFilterMap>
271 class SubGraphWrapper : public GraphWrapper<Graph> {
273 NodeFilterMap* node_filter_map;
274 EdgeFilterMap* edge_filter_map;
277 SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
278 EdgeFilterMap& _edge_filter_map) :
279 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
280 edge_filter_map(&_edge_filter_map) { }
282 typedef typename GraphWrapper<Graph>::Node Node;
284 friend class GraphWrapper<Graph>;
285 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
286 typename Graph::NodeIt n;
289 NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
290 NodeIt(const Invalid& i) : n(i) { }
291 NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
293 while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])
296 operator Node() const { return Node(typename Graph::Node(n)); }
298 typedef typename GraphWrapper<Graph>::Edge Edge;
300 friend class GraphWrapper<Graph>;
301 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
302 typename Graph::OutEdgeIt e;
305 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
306 OutEdgeIt(const Invalid& i) : e(i) { }
307 OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
309 e(*(_G.graph), typename Graph::Node(_n)) {
310 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
313 operator Edge() const { return Edge(typename Graph::Edge(e)); }
316 friend class GraphWrapper<Graph>;
317 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
318 typename Graph::InEdgeIt e;
321 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
322 InEdgeIt(const Invalid& i) : e(i) { }
323 InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
325 e(*(_G.graph), typename Graph::Node(_n)) {
326 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
329 operator Edge() const { return Edge(typename Graph::Edge(e)); }
331 //typedef typename Graph::SymEdgeIt SymEdgeIt;
333 friend class GraphWrapper<Graph>;
334 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
335 typename Graph::EdgeIt e;
338 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
339 EdgeIt(const Invalid& i) : e(i) { }
340 EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
342 while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])
345 operator Edge() const { return Edge(typename Graph::Edge(e)); }
348 NodeIt& first(NodeIt& i) const {
349 i=NodeIt(*this); return i;
351 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
352 i=OutEdgeIt(*this, p); return i;
354 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
355 i=InEdgeIt(*this, p); return i;
357 EdgeIt& first(EdgeIt& i) const {
358 i=EdgeIt(*this); return i;
361 NodeIt& next(NodeIt& i) const {
363 while (graph->valid(i) && !(*node_filter_map)[i.n]) { graph->next(i.n); }
366 OutEdgeIt& next(OutEdgeIt& i) const {
368 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
371 InEdgeIt& next(InEdgeIt& i) const {
373 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
376 EdgeIt& next(EdgeIt& i) const {
378 while (graph->valid(i) && !(*edge_filter_map)[i.e]) { graph->next(i.e); }
382 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
383 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
384 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
385 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
387 void hide(const Node& n) const { node_filter_map->set(n, false); }
388 void hide(const Edge& e) const { edge_filter_map->set(e, false); }
390 void unHide(const Node& n) const { node_filter_map->set(n, true); }
391 void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
393 bool hidden(const Node& n) const { return (*node_filter_map)[n]; }
394 bool hidden(const Edge& e) const { return (*edge_filter_map)[e]; }
397 /// A wrapper for getting an undirected graph by forgetting the orientation of a directed one.
399 /// A wrapper for getting an undirected graph by forgetting the orientation of a directed one.
400 template<typename Graph>
401 class UndirGraphWrapper : public GraphWrapper<Graph> {
403 typedef typename GraphWrapper<Graph>::Node Node;
404 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
405 typedef typename GraphWrapper<Graph>::Edge Edge;
406 typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
408 UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
411 friend class UndirGraphWrapper<Graph>;
412 bool out_or_in; //true iff out
413 typename Graph::OutEdgeIt out;
414 typename Graph::InEdgeIt in;
417 OutEdgeIt(const Invalid& i) : Edge(i) { }
418 OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
419 out_or_in=true; _G.graph->first(out, _n);
420 if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n); }
422 operator Edge() const {
423 if (out_or_in) return Edge(out); else return Edge(in);
428 typedef OutEdgeIt InEdgeIt;
430 using GraphWrapper<Graph>::first;
431 // NodeIt& first(NodeIt& i) const {
432 // i=NodeIt(*this); return i;
434 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
435 i=OutEdgeIt(*this, p); return i;
438 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
439 // i=InEdgeIt(*this, p); return i;
441 // EdgeIt& first(EdgeIt& i) const {
442 // i=EdgeIt(*this); return i;
445 using GraphWrapper<Graph>::next;
446 // NodeIt& next(NodeIt& n) const {
447 // GraphWrapper<Graph>::next(n);
450 OutEdgeIt& next(OutEdgeIt& e) const {
452 typename Graph::Node n=graph->tail(e.out);
454 if (!graph->valid(e.out)) { e.out_or_in=false; graph->first(e.in, n); }
461 // EdgeIt& next(EdgeIt& e) const {
462 // GraphWrapper<Graph>::next(n);
463 // // graph->next(e.e);
467 Node aNode(const OutEdgeIt& e) const {
468 if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
469 Node bNode(const OutEdgeIt& e) const {
470 if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
473 /// A wrapper for composing the residual graph for directed flow and circulation problems.
475 /// A wrapper for composing the residual graph for directed flow and circulation problems.
476 template<typename Graph, typename Number,
477 typename CapacityMap, typename FlowMap>
478 class ResGraphWrapper : public GraphWrapper<Graph> {
480 const CapacityMap* capacity;
484 ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
486 GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
491 friend class OutEdgeIt;
493 typedef typename GraphWrapper<Graph>::Node Node;
494 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
495 class Edge : public Graph::Edge {
496 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
498 bool forward; //true, iff forward
499 // typename Graph::Edge e;
502 Edge(const typename Graph::Edge& _e, bool _forward) :
503 Graph::Edge(_e), forward(_forward) { }
504 Edge(const Invalid& i) : Graph::Edge(i), forward(false) { }
505 //the unique invalid iterator
506 friend bool operator==(const Edge& u, const Edge& v) {
507 return (v.forward==u.forward &&
508 static_cast<typename Graph::Edge>(u)==
509 static_cast<typename Graph::Edge>(v));
511 friend bool operator!=(const Edge& u, const Edge& v) {
512 return (v.forward!=u.forward ||
513 static_cast<typename Graph::Edge>(u)!=
514 static_cast<typename Graph::Edge>(v));
519 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
521 typename Graph::OutEdgeIt out;
522 typename Graph::InEdgeIt in;
527 // OutEdgeIt(const Edge& e) : Edge(e) { }
528 OutEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
529 //the unique invalid iterator
530 OutEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
532 resG.graph->first(out, v);
533 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
534 if (!resG.graph->valid(out)) {
536 resG.graph->first(in, v);
537 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
540 operator Edge() const {
542 // e.forward=this->forward;
543 // if (this->forward) e=out; else e=in;
546 return Edge(out, this->forward);
548 return Edge(in, this->forward);
553 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
555 typename Graph::OutEdgeIt out;
556 typename Graph::InEdgeIt in;
561 // OutEdgeIt(const Edge& e) : Edge(e) { }
562 InEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { }
563 //the unique invalid iterator
564 InEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {
566 resG.graph->first(in, v);
567 while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); }
568 if (!resG.graph->valid(in)) {
570 resG.graph->first(out, v);
571 while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); }
574 operator Edge() const {
576 // e.forward=this->forward;
577 // if (this->forward) e=out; else e=in;
580 return Edge(in, this->forward);
582 return Edge(out, this->forward);
587 friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
589 typename Graph::EdgeIt e;
593 EdgeIt(const Invalid& i) : e(i), forward(false) { }
594 EdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG) {
596 resG.graph->first(e);
597 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
598 if (!resG.graph->valid(e)) {
600 resG.graph->first(e);
601 while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);
604 operator Edge() const {
605 return Edge(e, this->forward);
609 using GraphWrapper<Graph>::first;
610 // NodeIt& first(NodeIt& i) const {
611 // i=NodeIt(*this); return i;
613 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
614 i=OutEdgeIt(*this, p); return i;
617 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
618 i=InEdgeIt(*this, p); return i;
620 EdgeIt& first(EdgeIt& i) const {
621 i=EdgeIt(*this); return i;
624 using GraphWrapper<Graph>::next;
625 // NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
626 OutEdgeIt& next(OutEdgeIt& e) const {
628 Node v=graph->aNode(e.out);
630 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
631 if (!graph->valid(e.out)) {
633 graph->first(e.in, v);
634 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
638 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
643 InEdgeIt& next(InEdgeIt& e) const {
645 Node v=graph->aNode(e.in);
647 while( graph->valid(e.in) && !(resCap(e)>0) ) { graph->next(e.in); }
648 if (!graph->valid(e.in)) {
650 graph->first(e.out, v);
651 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
655 while( graph->valid(e.out) && !(resCap(e)>0) ) { graph->next(e.out); }
659 EdgeIt& next(EdgeIt& e) const {
662 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
663 if (!graph->valid(e.e)) {
666 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
670 while( graph->valid(e.e) && !(resCap(e)>0) ) { graph->next(e.e); }
675 Node tail(Edge e) const {
676 return ((e.forward) ? graph->tail(e) : graph->head(e)); }
677 Node head(Edge e) const {
678 return ((e.forward) ? graph->head(e) : graph->tail(e)); }
680 Node aNode(OutEdgeIt e) const {
681 return ((e.forward) ? graph->aNode(e.out) : graph->aNode(e.in)); }
682 Node bNode(OutEdgeIt e) const {
683 return ((e.forward) ? graph->bNode(e.out) : graph->bNode(e.in)); }
685 // int nodeNum() const { return graph->nodeNum(); }
687 void edgeNum() const { }
688 //int edgeNum() const { return graph->edgeNum(); }
691 // int id(Node v) const { return graph->id(v); }
693 bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
694 bool valid(Edge e) const {
695 return graph->valid(e);
696 //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
699 void augment(const Edge& e, Number a) const {
701 // flow->set(e.out, flow->get(e.out)+a);
702 flow->set(e, (*flow)[e]+a);
704 // flow->set(e.in, flow->get(e.in)-a);
705 flow->set(e, (*flow)[e]-a);
708 Number resCap(const Edge& e) const {
710 // return (capacity->get(e.out)-flow->get(e.out));
711 return ((*capacity)[e]-(*flow)[e]);
713 // return (flow->get(e.in));
717 // Number resCap(typename Graph::OutEdgeIt out) const {
718 // // return (capacity->get(out)-flow->get(out));
719 // return ((*capacity)[out]-(*flow)[out]);
722 // Number resCap(typename Graph::InEdgeIt in) const {
723 // // return (flow->get(in));
724 // return ((*flow)[in]);
727 template <typename T>
729 typename Graph::EdgeMap<T> forward_map, backward_map;
731 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
732 EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
733 void set(Edge e, T a) {
735 forward_map.set(e.out, a);
737 backward_map.set(e.in, a);
739 T operator[](Edge e) const {
741 return forward_map[e.out];
743 return backward_map[e.in];
745 // T get(Edge e) const {
747 // return forward_map.get(e.out);
749 // return backward_map.get(e.in);
754 /// ErasingFirstGraphWrapper for blocking flows.
756 /// ErasingFirstGraphWrapper for blocking flows.
757 template<typename Graph, typename FirstOutEdgesMap>
758 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
760 FirstOutEdgesMap* first_out_edges;
762 ErasingFirstGraphWrapper(Graph& _graph,
763 FirstOutEdgesMap& _first_out_edges) :
764 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
766 typedef typename GraphWrapper<Graph>::Node Node;
768 // friend class GraphWrapper<Graph>;
769 // friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
770 // typename Graph::NodeIt n;
773 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
774 // NodeIt(const Invalid& i) : n(i) { }
775 // NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
776 // n(*(_G.graph)) { }
777 // operator Node() const { return Node(typename Graph::Node(n)); }
779 typedef typename GraphWrapper<Graph>::Edge Edge;
781 friend class GraphWrapper<Graph>;
782 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
783 // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
784 typename Graph::OutEdgeIt e;
787 OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
788 OutEdgeIt(const Invalid& i) : e(i) { }
789 OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
791 e((*_G.first_out_edges)[_n]) { }
792 operator Edge() const { return Edge(typename Graph::Edge(e)); }
795 friend class GraphWrapper<Graph>;
796 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
797 // typedef typename Graph::InEdgeIt GraphInEdgeIt;
798 typename Graph::InEdgeIt e;
801 InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
802 InEdgeIt(const Invalid& i) : e(i) { }
803 InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
805 e(*(_G.graph), typename Graph::Node(_n)) { }
806 operator Edge() const { return Edge(typename Graph::Edge(e)); }
808 //typedef typename Graph::SymEdgeIt SymEdgeIt;
810 friend class GraphWrapper<Graph>;
811 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
812 // typedef typename Graph::EdgeIt GraphEdgeIt;
813 typename Graph::EdgeIt e;
816 EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
817 EdgeIt(const Invalid& i) : e(i) { }
818 EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
820 operator Edge() const { return Edge(typename Graph::Edge(e)); }
823 using GraphWrapper<Graph>::first;
824 // NodeIt& first(NodeIt& i) const {
825 // i=NodeIt(*this); return i;
827 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
828 i=OutEdgeIt(*this, p); return i;
830 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
831 i=InEdgeIt(*this, p); return i;
833 EdgeIt& first(EdgeIt& i) const {
834 i=EdgeIt(*this); return i;
837 using GraphWrapper<Graph>::next;
838 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
839 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
840 InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
841 EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
843 Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
844 Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
845 Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
846 Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
848 void erase(const OutEdgeIt& e) const {
851 first_out_edges->set(this->tail(e), f.e);
857 // /// experimentral, do not try it.
858 // template<typename Graph>
859 // class stGraphWrapper : public GraphWrapper<Graph> {
871 // stGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph),
872 // s(INVALID, 1), t(INVALID, 2) { }
874 // class Node : public Graph::Node {
875 // friend class GraphWrapper<Graph>;
876 // friend class stGraphWrapper<Graph>;
878 // int spec; //0 if real node, 1 iff s, 2 iff t
881 // Node(const typename Graph::Node& _n, int _spec=0) :
882 // Graph::Node(_n), spec(_spec) { }
883 // Node(const Invalid& i) : Graph::Node(i), spec(2) { }
884 // //invalid: (invalid, 2);
888 // friend class GraphWrapper<Graph>;
889 // friend class stGraphWrapper<Graph>;
890 // typename Graph::NodeIt n;
894 // NodeIt(const typename Graph::NodeIt& _n, int _spec=0) :
895 // n(_n), spec(_spec) { }
896 // NodeIt(const Invalid& i) : n(i), spec(2) { }
897 // NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)), spec(0) {
898 // if (!_G->valid(n)) spec=1;
900 // operator Node() const { return Node(n, spec); }
902 // // typedef typename Graph::Edge Edge;
903 // class Edge : public Graph::Edge {
904 // friend class GraphWrapper<Graph>;
905 // friend class stGraphWrapper<Graph>;
910 // Edge(const typename Graph::Edge& _e) :
911 // Graph::Edge(_e), tail_spec(i, 0), head_spec(i, 0) {
912 // //a tail-t es a head-et real node-ra csinaljuk
914 // Edge(const Invalid& i) : Graph::Edge(i), tail_spec(i), head_spec(i) { }
917 // friend class GraphWrapper<Graph>;
918 // friend class stGraphWrapper<Graph>;
919 // typename Graph::OutEdgeIt e;
924 // OutEdgeIt(const typename Graph::OutEdgeIt& _e) :
925 // e(_e), tail_spec(i, 0), head_spec(i, 0) {
926 // //a tail-t es a head-et real node-ra csinaljuk
928 // OutEdgeIt(const Invalid& i) : e(i), tail_spec(i), head_spec(i) { }
929 // //invalid: (barmi, 0, 2)
930 // OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) {
931 // switch (_n.spec) {
933 // e=typename Graph::OutEdgeIt(*(_G.graph), typename Graph::Node(_n));
936 // if (!_G.graph->valid(e)) spec=1;
941 // _head(_G.graph->first(typename Graph::NodeIt()));
947 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
950 // friend class GraphWrapper<Graph>;
951 // typename Graph::InEdgeIt e;
954 // InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
955 // InEdgeIt(const Invalid& i) : e(i) { }
956 // InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :
957 // e(*(_G.graph), typename Graph::Node(_n)) { }
958 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
960 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
962 // friend class GraphWrapper<Graph>;
963 // typename Graph::EdgeIt e;
966 // EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
967 // EdgeIt(const Invalid& i) : e(i) { }
968 // EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
969 // operator Edge() const { return Edge(typename Graph::Edge(e)); }
972 // NodeIt& first(NodeIt& i) const {
973 // i=NodeIt(*this); return i;
975 // OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
976 // i=OutEdgeIt(*this, p); return i;
978 // InEdgeIt& first(InEdgeIt& i, const Node& p) const {
979 // i=InEdgeIt(*this, p); return i;
981 // EdgeIt& first(EdgeIt& i) const {
982 // i=EdgeIt(*this); return i;
985 // NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
986 // OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
987 // InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
988 // EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
990 // Node head(const Edge& e) const {
991 // return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
992 // Node tail(const Edge& e) const {
993 // return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
995 // bool valid(const Node& n) const {
996 // return graph->valid(static_cast<typename Graph::Node>(n)); }
997 // bool valid(const Edge& e) const {
998 // return graph->valid(static_cast<typename Graph::Edge>(e)); }
1000 // int nodeNum() const { return graph->nodeNum(); }
1001 // int edgeNum() const { return graph->edgeNum(); }
1003 // Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
1004 // Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
1005 // Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
1006 // Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
1008 // Node addNode() const { return Node(graph->addNode()); }
1009 // Edge addEdge(const Node& tail, const Node& head) const {
1010 // return Edge(graph->addEdge(tail, head)); }
1012 // void erase(const Node& i) const { graph->erase(i); }
1013 // void erase(const Edge& i) const { graph->erase(i); }
1015 // void clear() const { graph->clear(); }
1017 // template<typename T> class NodeMap : public Graph::NodeMap<T> {
1019 // NodeMap(const GraphWrapper<Graph>& _G) :
1020 // Graph::NodeMap<T>(*(_G.graph)) { }
1021 // NodeMap(const GraphWrapper<Graph>& _G, T a) :
1022 // Graph::NodeMap<T>(*(_G.graph), a) { }
1025 // template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1027 // EdgeMap(const GraphWrapper<Graph>& _G) :
1028 // Graph::EdgeMap<T>(*(_G.graph)) { }
1029 // EdgeMap(const GraphWrapper<Graph>& _G, T a) :
1030 // Graph::EdgeMap<T>(*(_G.graph), a) { }
1036 #endif //HUGO_GRAPH_WRAPPER_H