COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/hugo/graph_wrapper.h @ 788:c3187cafcabf

Last change on this file since 788:c3187cafcabf was 777:a82713ed19f3, checked in by marci, 20 years ago

graph_wrapper.h is ready for hugo 0.2

File size: 70.3 KB
RevLine 
[556]1// -*- c++ -*-
2#ifndef HUGO_GRAPH_WRAPPER_H
3#define HUGO_GRAPH_WRAPPER_H
4
5///\ingroup gwrappers
6///\file
7///\brief Several graph wrappers.
8///
9///This file contains several useful graph wrapper functions.
10///
11///\author Marton Makai
12
13#include <hugo/invalid.h>
[650]14#include <hugo/maps.h>
[774]15#include <iostream>
[556]16
17namespace hugo {
18
19  // Graph wrappers
20
21  /// \addtogroup gwrappers
22  /// A main parts of HUGOlib are the different graph structures,
23  /// generic graph algorithms, graph concepts which couple these, and
24  /// graph wrappers. While the previous ones are more or less clear, the
25  /// latter notion needs further explanation.
26  /// Graph wrappers are graph classes which serve for considering graph
27  /// structures in different ways. A short example makes the notion much
28  /// clearer.
29  /// Suppose that we have an instance \c g of a directed graph
30  /// type say \c ListGraph and an algorithm
31  /// \code template<typename Graph> int algorithm(const Graph&); \endcode
32  /// is needed to run on the reversely oriented graph.
33  /// It may be expensive (in time or in memory usage) to copy
34  /// \c g with the reverse orientation.
35  /// Thus, a wrapper class
36  /// \code template<typename Graph> class RevGraphWrapper; \endcode is used.
37  /// The code looks as follows
38  /// \code
39  /// ListGraph g;
40  /// RevGraphWrapper<ListGraph> rgw(g);
41  /// int result=algorithm(rgw);
42  /// \endcode
43  /// After running the algorithm, the original graph \c g
44  /// remains untouched. Thus the graph wrapper used above is to consider the
45  /// original graph with reverse orientation.
46  /// This techniques gives rise to an elegant code, and
47  /// based on stable graph wrappers, complex algorithms can be
48  /// implemented easily.
49  /// In flow, circulation and bipartite matching problems, the residual
50  /// graph is of particular importance. Combining a wrapper implementing
51  /// this, shortest path algorithms and minimum mean cycle algorithms,
52  /// a range of weighted and cardinality optimization algorithms can be
53  /// obtained. For lack of space, for other examples,
54  /// the interested user is referred to the detailed documentation of graph
55  /// wrappers.
56  /// The behavior of graph wrappers can be very different. Some of them keep
57  /// capabilities of the original graph while in other cases this would be
58  /// meaningless. This means that the concepts that they are a model of depend
59  /// on the graph wrapper, and the wrapped graph(s).
60  /// If an edge of \c rgw is deleted, this is carried out by
61  /// deleting the corresponding edge of \c g. But for a residual
62  /// graph, this operation has no sense.
63  /// Let we stand one more example here to simplify your work.
64  /// wrapper class
65  /// \code template<typename Graph> class RevGraphWrapper; \endcode
66  /// has constructor
67  /// <tt> RevGraphWrapper(Graph& _g)</tt>.
68  /// This means that in a situation,
69  /// when a <tt> const ListGraph& </tt> reference to a graph is given,
70  /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
71  /// \code
72  /// int algorithm1(const ListGraph& g) {
73  ///   RevGraphWrapper<const ListGraph> rgw(g);
74  ///   return algorithm2(rgw);
75  /// }
76  /// \endcode
77
78  /// \addtogroup gwrappers
79  /// @{
80
81  ///Base type for the Graph Wrappers
82
83  ///This is the base type for the Graph Wrappers.
84  ///\todo Some more docs...
85  ///
[612]86  ///\author Marton Makai
[556]87  template<typename Graph>
88  class GraphWrapper {
89  protected:
90    Graph* graph;
91    GraphWrapper() : graph(0) { }
92    void setGraph(Graph& _graph) { graph=&_graph; }
93
94  public:
95    typedef Graph BaseGraph;
96    typedef Graph ParentGraph;
97
98    GraphWrapper(Graph& _graph) : graph(&_graph) { }
[774]99    GraphWrapper(const GraphWrapper<Graph>& gw) : graph(gw.graph) { }
[556]100//     Graph& getGraph() const { return *graph; }
101 
[774]102    typedef typename Graph::Node Node;
103//     class Node : public Graph::Node {
104//       friend class GraphWrapper<Graph>;
105//     public:
106//       Node() { }
107//       Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
108//       // /// \bug construction throughrthr multiple levels should be
109//       // /// handled better
110//       // Node(const typename ParentGraph::ParentGraph::Node& _n) :
111//       // Graph::Node(_n) { }
112//       Node(const Invalid& i) : Graph::Node(i) { }
113//     };
114    class NodeIt : public Node {
115      const GraphWrapper<Graph>* gw;
[556]116      friend class GraphWrapper<Graph>;
117     public:
118      NodeIt() { }
[774]119      //      NodeIt(const NodeIt& n) : Node(n), gw(n.gw) { }
120      NodeIt(Invalid i) : Node(i) { }
121      NodeIt(const GraphWrapper<Graph>& _gw) :
122        Node(typename Graph::NodeIt(*(_gw.graph))), gw(&_gw) { }
123      NodeIt(const GraphWrapper<Graph>& _gw, const Node& n) :
124        Node(n), gw(&_gw) { }
125      NodeIt& operator++() {
126        *(static_cast<Node*>(this))=
127          ++(typename Graph::NodeIt(*(gw->graph), *this));
128        return *this;
129      }
[556]130    };
[774]131    typedef typename Graph::Edge Edge;
132//     class Edge : public Graph::Edge {
133//       friend class GraphWrapper<Graph>;
134//     public:
135//       Edge() { }
136//       Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
137//       Edge(const Invalid& i) : Graph::Edge(i) { }
138//     };
139    class OutEdgeIt : public Edge {
140      const GraphWrapper<Graph>* gw;
[556]141      friend class GraphWrapper<Graph>;
[774]142     public:
143      OutEdgeIt() { }
144      //OutEdgeIt(const OutEdgeIt& e) : Edge(e), gw(e.gw) { }
145      OutEdgeIt(Invalid i) : Edge(i) { }
146      OutEdgeIt(const GraphWrapper<Graph>& _gw, const Node& n) :
147        Edge(typename Graph::OutEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
148      OutEdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) :
149        Edge(e), gw(&_gw) { }
150      OutEdgeIt& operator++() {
151        *(static_cast<Edge*>(this))=
152          ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
153        return *this;
154      }
[556]155    };
[774]156    class InEdgeIt : public Edge {
157      const GraphWrapper<Graph>* gw;
[556]158      friend class GraphWrapper<Graph>;
[774]159     public:
[556]160      InEdgeIt() { }
[774]161      //InEdgeIt(const InEdgeIt& e) : Edge(e), gw(e.gw) { }
162      InEdgeIt(Invalid i) : Edge(i) { }
163      InEdgeIt(const GraphWrapper<Graph>& _gw, const Node& n) :
164        Edge(typename Graph::InEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
165      InEdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) :
166        Edge(e), gw(&_gw) { }
167      InEdgeIt& operator++() {
168        *(static_cast<Edge*>(this))=
169          ++(typename Graph::InEdgeIt(*(gw->graph), *this));
170        return *this;
171      }
[556]172    };
173    //typedef typename Graph::SymEdgeIt SymEdgeIt;
[774]174    class EdgeIt : public Edge {
175      const GraphWrapper<Graph>* gw;
[556]176      friend class GraphWrapper<Graph>;
[774]177     public:
[556]178      EdgeIt() { }
[774]179      //EdgeIt(const EdgeIt& e) : Edge(e), gw(e.gw) { }
180      EdgeIt(Invalid i) : Edge(i) { }
181      EdgeIt(const GraphWrapper<Graph>& _gw) :
182        Edge(typename Graph::EdgeIt(*(_gw.graph))), gw(&_gw) { }
183      EdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) :
[777]184        Edge(e), gw(&_gw) { }
[774]185      EdgeIt& operator++() {
186        *(static_cast<Edge*>(this))=
187          ++(typename Graph::EdgeIt(*(gw->graph), *this));
188        return *this;
189      }
[556]190    };
191   
192    NodeIt& first(NodeIt& i) const {
193      i=NodeIt(*this); return i;
194    }
195    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
196      i=OutEdgeIt(*this, p); return i;
197    }
198    InEdgeIt& first(InEdgeIt& i, const Node& p) const {
199      i=InEdgeIt(*this, p); return i;
200    }
201    EdgeIt& first(EdgeIt& i) const {
202      i=EdgeIt(*this); return i;
203    }
204
[774]205//     NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
206//     OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
207//     InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
208//     EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }   
[556]209
210    Node tail(const Edge& e) const {
211      return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
212    Node head(const Edge& e) const {
213      return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
214
[774]215//     bool valid(const Node& n) const {
216//       return graph->valid(static_cast<typename Graph::Node>(n)); }
217//     bool valid(const Edge& e) const {
218//       return graph->valid(static_cast<typename Graph::Edge>(e)); }
[556]219
220    int nodeNum() const { return graph->nodeNum(); }
221    int edgeNum() const { return graph->edgeNum(); }
222 
[774]223//     Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
224//     Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
225//     Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
226//     Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
[556]227 
228    Node addNode() const { return Node(graph->addNode()); }
229    Edge addEdge(const Node& tail, const Node& head) const {
230      return Edge(graph->addEdge(tail, head)); }
231
232    void erase(const Node& i) const { graph->erase(i); }
233    void erase(const Edge& i) const { graph->erase(i); }
234 
235    void clear() const { graph->clear(); }
236   
[736]237    bool forward(const Edge& e) const { return graph->forward(e); }
238    bool backward(const Edge& e) const { return graph->backward(e); }
[739]239
240    int id(const Node& v) const { return graph->id(v); }
241    int id(const Edge& e) const { return graph->id(e); }
[650]242   
[738]243    Edge opposite(const Edge& e) const { return Edge(graph->opposite(e)); }
[650]244
[556]245    template<typename T> class NodeMap : public Graph::template NodeMap<T> {
246      typedef typename Graph::template NodeMap<T> Parent;
247    public:
[774]248      NodeMap(const GraphWrapper<Graph>& gw) :  Parent(*(gw.graph)) { }
249      NodeMap(const GraphWrapper<Graph>& gw, T a) : Parent(*(gw.graph), a) { }
[556]250    };
251
252    template<typename T> class EdgeMap : public Graph::template EdgeMap<T> {
253      typedef typename Graph::template EdgeMap<T> Parent;
254    public:
[774]255      EdgeMap(const GraphWrapper<Graph>& gw) : Parent(*(gw.graph)) { }
256      EdgeMap(const GraphWrapper<Graph>& gw, T a) : Parent(*(gw.graph), a) { }
[556]257    };
258  };
259
[569]260
261
[556]262  /// A graph wrapper which reverses the orientation of the edges.
263
264  /// A graph wrapper which reverses the orientation of the edges.
[612]265  /// Thus \c Graph have to be a directed graph type.
[556]266  ///
267  ///\author Marton Makai
268  template<typename Graph>
269  class RevGraphWrapper : public GraphWrapper<Graph> {
[650]270  public:
271    typedef GraphWrapper<Graph> Parent;
[556]272  protected:
[612]273    RevGraphWrapper() : GraphWrapper<Graph>() { }
[556]274  public:
275    RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { } 
[774]276    RevGraphWrapper(const RevGraphWrapper<Graph>& gw) : Parent(gw) { }
[556]277
278    typedef typename GraphWrapper<Graph>::Node Node;
279    typedef typename GraphWrapper<Graph>::Edge Edge;
280    //If Graph::OutEdgeIt is not defined
281    //and we do not want to use RevGraphWrapper::InEdgeIt,
282    //the typdef techinque does not work.
283    //Unfortunately all the typedefs are instantiated in templates.
284    //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
285    //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
286
[774]287    class OutEdgeIt : public Edge {
288      const RevGraphWrapper<Graph>* gw;
[556]289      friend class GraphWrapper<Graph>;
[774]290     public:
[556]291      OutEdgeIt() { }
[774]292      //OutEdgeIt(const OutEdgeIt& e) : Edge(e), gw(e.gw) { }
293      OutEdgeIt(Invalid i) : Edge(i) { }
294      OutEdgeIt(const RevGraphWrapper<Graph>& _gw, const Node& n) :
295        Edge(typename Graph::InEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
296      OutEdgeIt(const RevGraphWrapper<Graph>& _gw, const Edge& e) :
297        Edge(e), gw(&_gw) { }
298      OutEdgeIt& operator++() {
299        *(static_cast<Edge*>(this))=
300          ++(typename Graph::InEdgeIt(*(gw->graph), *this));
301        return *this;
302      }
[556]303    };
[774]304    class InEdgeIt : public Edge {
305      const RevGraphWrapper<Graph>* gw;
[556]306      friend class GraphWrapper<Graph>;
[774]307     public:
[556]308      InEdgeIt() { }
[774]309      //InEdgeIt(const InEdgeIt& e) : Edge(e), gw(e.gw) { }
310      InEdgeIt(Invalid i) : Edge(i) { }
311      InEdgeIt(const RevGraphWrapper<Graph>& _gw, const Node& n) :
312        Edge(typename Graph::OutEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
313      InEdgeIt(const RevGraphWrapper<Graph>& _gw, const Edge& e) :
314        Edge(e), gw(&_gw) { }
315      InEdgeIt& operator++() {
316        *(static_cast<Edge*>(this))=
317          ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
318        return *this;
319      }
[556]320    };
321
322    using GraphWrapper<Graph>::first;
323    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
324      i=OutEdgeIt(*this, p); return i;
325    }
326    InEdgeIt& first(InEdgeIt& i, const Node& p) const {
327      i=InEdgeIt(*this, p); return i;
328    }
329
[774]330//     using GraphWrapper<Graph>::next;
331//     OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
332//     InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
[556]333
[774]334//     Node aNode(const OutEdgeIt& e) const {
335//       return Node(this->graph->aNode(e.e)); }
336//     Node aNode(const InEdgeIt& e) const {
337//       return Node(this->graph->aNode(e.e)); }
338//     Node bNode(const OutEdgeIt& e) const {
339//       return Node(this->graph->bNode(e.e)); }
340//     Node bNode(const InEdgeIt& e) const {
341//       return Node(this->graph->bNode(e.e)); }
[556]342
343    Node tail(const Edge& e) const {
344      return GraphWrapper<Graph>::head(e); }
345    Node head(const Edge& e) const {
346      return GraphWrapper<Graph>::tail(e); }
347
348  };
349
[775]350
351
[612]352  /// A graph wrapper for hiding nodes and edges from a graph.
[556]353 
354  /// This wrapper shows a graph with filtered node-set and
355  /// edge-set. The quick brown fox iterator jumps over
356  /// the lazy dog nodes or edges if the values for them are false
357  /// in the bool maps.
358  ///
359  ///\author Marton Makai
360  template<typename Graph, typename NodeFilterMap,
361           typename EdgeFilterMap>
362  class SubGraphWrapper : public GraphWrapper<Graph> {
[650]363  public:
364    typedef GraphWrapper<Graph> Parent;
[556]365  protected:
366    NodeFilterMap* node_filter_map;
367    EdgeFilterMap* edge_filter_map;
368
[612]369    SubGraphWrapper() : GraphWrapper<Graph>(),
[556]370                        node_filter_map(0), edge_filter_map(0) { }
371    void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
372      node_filter_map=&_node_filter_map;
373    }
374    void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
375      edge_filter_map=&_edge_filter_map;
376    }
377   
378  public:
379    SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
380                    EdgeFilterMap& _edge_filter_map) :
381      GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
382      edge_filter_map(&_edge_filter_map) { } 
383
384    typedef typename GraphWrapper<Graph>::Node Node;
[775]385//     class NodeIt {
386//       friend class GraphWrapper<Graph>;
387//       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
388//       typename Graph::NodeIt n;
389//      public:
390//       NodeIt() { }
391//       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
392//       NodeIt(const Invalid& i) : n(i) { }
393//       NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
394//      n(*(_G.graph)) {
395//      while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])
396//        _G.graph->next(n);
397//       }
398//       operator Node() const { return Node(typename Graph::Node(n)); }
399//     };
400    class NodeIt : public Node {
401      const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
[556]402      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
[775]403    public:
[556]404      NodeIt() { }
[775]405      //      NodeIt(const NodeIt& n) : Node(n), gw(n.gw) { }
406      NodeIt(Invalid i) : Node(i) { }
407      NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw) :
408        Node(typename Graph::NodeIt(*(_gw.graph))), gw(&_gw) { }
409      NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw,
410             const Node& n) :
411        Node(n), gw(&_gw) { }
412      NodeIt& operator++() {
413        *(static_cast<Node*>(this))=
414          ++(typename Graph::NodeIt(*(gw->graph), *this));
415        while (*static_cast<Node*>(this)!=INVALID &&
416               !(*(gw->node_filter_map))[*this])
417          *(static_cast<Node*>(this))=
418            ++(typename Graph::NodeIt(*(gw->graph), *this));
419        return *this;
[556]420      }
421    };
422    typedef typename GraphWrapper<Graph>::Edge Edge;
[775]423    class OutEdgeIt : public Edge {
424      const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
[556]425      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
426    public:
427      OutEdgeIt() { }
[775]428      //      OutEdgeIt(const OutEdgeIt& e) : Edge(e), gw(e.gw) { }
429      OutEdgeIt(Invalid i) : Edge(i) { }
430      OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, const Node& n) :
[777]431        Edge(typename Graph::OutEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
[775]432      OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw,
433             const Edge& e) :
434        Edge(e), gw(&_gw) { }
435      OutEdgeIt& operator++() {
436        *(static_cast<Edge*>(this))=
437          ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
438        while (*static_cast<Edge*>(this)!=INVALID &&
439               !(*(gw->edge_filter_map))[*this])
440          *(static_cast<Edge*>(this))=
441            ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
442        return *this;
[556]443      }
444    };
[775]445    class InEdgeIt : public Edge {
446      const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
[556]447      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
448    public:
449      InEdgeIt() { }
[775]450      //      InEdgeIt(const InEdgeIt& e) : Edge(e), gw(e.gw) { }
451      InEdgeIt(Invalid i) : Edge(i) { }
452      InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, const Node& n) :
[777]453        Edge(typename Graph::InEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
[775]454      InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw,
455             const Edge& e) :
456        Edge(e), gw(&_gw) { }
457      InEdgeIt& operator++() {
458        *(static_cast<Edge*>(this))=
459          ++(typename Graph::InEdgeIt(*(gw->graph), *this));
460        while (*static_cast<Edge*>(this)!=INVALID &&
461               !(*(gw->edge_filter_map))[*this])
462          *(static_cast<Edge*>(this))=
463            ++(typename Graph::InEdgeIt(*(gw->graph), *this));
464        return *this;
[556]465      }
466    };
[775]467    class EdgeIt : public Edge {
468      const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
[556]469      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
470    public:
471      EdgeIt() { }
[775]472      //      EdgeIt(const EdgeIt& e) : Edge(e), gw(e.gw) { }
473      EdgeIt(Invalid i) : Edge(i) { }
474      EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw) :
475        Edge(typename Graph::EdgeIt(*(_gw.graph))), gw(&_gw) { }
476      EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw,
477             const Edge& e) :
478        Edge(e), gw(&_gw) { }
479      EdgeIt& operator++() {
480        *(static_cast<Edge*>(this))=
481          ++(typename Graph::EdgeIt(*(gw->graph), *this));
482        while (*static_cast<Edge*>(this)!=INVALID &&
483               !(*(gw->edge_filter_map))[*this])
484          *(static_cast<Edge*>(this))=
485            ++(typename Graph::EdgeIt(*(gw->graph), *this));
486        return *this;
[556]487      }
488    };
489
490    NodeIt& first(NodeIt& i) const {
491      i=NodeIt(*this); return i;
492    }
493    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
494      i=OutEdgeIt(*this, p); return i;
495    }
496    InEdgeIt& first(InEdgeIt& i, const Node& p) const {
497      i=InEdgeIt(*this, p); return i;
498    }
499    EdgeIt& first(EdgeIt& i) const {
500      i=EdgeIt(*this); return i;
501    }
502   
[775]503//     NodeIt& next(NodeIt& i) const {
504//       this->graph->next(i.n);
505//       while (this->graph->valid(i) && !(*node_filter_map)[i.n]) {
506//      this->graph->next(i.n); }
507//       return i;
508//     }
509//     OutEdgeIt& next(OutEdgeIt& i) const {
510//       this->graph->next(i.e);
511//       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
512//      this->graph->next(i.e); }
513//       return i;
514//     }
515//     InEdgeIt& next(InEdgeIt& i) const {
516//       this->graph->next(i.e);
517//       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
518//      this->graph->next(i.e); }
519//       return i;
520//     }
521//     EdgeIt& next(EdgeIt& i) const {
522//       this->graph->next(i.e);
523//       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {
524//      this->graph->next(i.e); }
525//       return i;
526//     }
[556]527
[775]528//     Node aNode(const OutEdgeIt& e) const {
529//       return Node(this->graph->aNode(e.e)); }
530//     Node aNode(const InEdgeIt& e) const {
531//       return Node(this->graph->aNode(e.e)); }
532//     Node bNode(const OutEdgeIt& e) const {
533//       return Node(this->graph->bNode(e.e)); }
534//     Node bNode(const InEdgeIt& e) const {
535//       return Node(this->graph->bNode(e.e)); }
[556]536
[561]537    /// This function hides \c n in the graph, i.e. the iteration
538    /// jumps over it. This is done by simply setting the value of \c n 
539    /// to be false in the corresponding node-map.
[556]540    void hide(const Node& n) const { node_filter_map->set(n, false); }
[561]541
542    /// This function hides \c e in the graph, i.e. the iteration
543    /// jumps over it. This is done by simply setting the value of \c e 
544    /// to be false in the corresponding edge-map.
[556]545    void hide(const Edge& e) const { edge_filter_map->set(e, false); }
546
[561]547    /// The value of \c n is set to be true in the node-map which stores
548    /// hide information. If \c n was hidden previuosly, then it is shown
549    /// again
550     void unHide(const Node& n) const { node_filter_map->set(n, true); }
551
552    /// The value of \c e is set to be true in the edge-map which stores
553    /// hide information. If \c e was hidden previuosly, then it is shown
554    /// again
[556]555    void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
556
[561]557    /// Returns true if \c n is hidden.
558    bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
559
560    /// Returns true if \c n is hidden.
561    bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
[593]562
[594]563    /// This is a linear time operation and works only if
[593]564    /// NodeIt is defined.
565    int nodeNum() const {
566      int i=0;
567      NodeIt n;
568      for (this->first(n); this->valid(n); this->next(n)) ++i;
569      return i;
570    }
571
572    /// This is a linear time operation and works only if
573    /// EdgeIt is defined.
574    int edgeNum() const {
575      int i=0;
576      EdgeIt e;
577      for (this->first(e); this->valid(e); this->next(e)) ++i;
578      return i;
579    }
580
[556]581  };
582
[569]583
584
[612]585  /// \brief A wrapper for forgetting the orientation of a graph.
586  ///
[556]587  /// A wrapper for getting an undirected graph by forgetting
588  /// the orientation of a directed one.
[589]589  ///
[612]590  /// \author Marton Makai
[556]591  template<typename Graph>
592  class UndirGraphWrapper : public GraphWrapper<Graph> {
[650]593  public:
594    typedef GraphWrapper<Graph> Parent;
[556]595  protected:
596    UndirGraphWrapper() : GraphWrapper<Graph>() { }
597   
598  public:
599    typedef typename GraphWrapper<Graph>::Node Node;
600    typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
601    typedef typename GraphWrapper<Graph>::Edge Edge;
602    typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
603
604    UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { } 
605
606    class OutEdgeIt {
607      friend class UndirGraphWrapper<Graph>;
608      bool out_or_in; //true iff out
609      typename Graph::OutEdgeIt out;
610      typename Graph::InEdgeIt in;
611    public:
612      OutEdgeIt() { }
613      OutEdgeIt(const Invalid& i) : Edge(i) { }
614      OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
615        out_or_in=true; _G.graph->first(out, _n);
616        if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n);        }
617      }
618      operator Edge() const {
619        if (out_or_in) return Edge(out); else return Edge(in);
620      }
621    };
622
623//FIXME InEdgeIt
624    typedef OutEdgeIt InEdgeIt;
625
626    using GraphWrapper<Graph>::first;
627//     NodeIt& first(NodeIt& i) const {
628//       i=NodeIt(*this); return i;
629//     }
630    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
631      i=OutEdgeIt(*this, p); return i;
632    }
633//FIXME
634//     InEdgeIt& first(InEdgeIt& i, const Node& p) const {
635//       i=InEdgeIt(*this, p); return i;
636//     }
637//     EdgeIt& first(EdgeIt& i) const {
638//       i=EdgeIt(*this); return i;
639//     }
640
641    using GraphWrapper<Graph>::next;
642//     NodeIt& next(NodeIt& n) const {
643//       GraphWrapper<Graph>::next(n);
644//       return n;
645//     }
646    OutEdgeIt& next(OutEdgeIt& e) const {
647      if (e.out_or_in) {
648        typename Graph::Node n=this->graph->tail(e.out);
649        this->graph->next(e.out);
650        if (!this->graph->valid(e.out)) {
651          e.out_or_in=false; this->graph->first(e.in, n); }
652      } else {
653        this->graph->next(e.in);
654      }
655      return e;
656    }
657    //FIXME InEdgeIt
658//     EdgeIt& next(EdgeIt& e) const {
659//       GraphWrapper<Graph>::next(n);
660// //      graph->next(e.e);
661//       return e;
662//     }
663
664    Node aNode(const OutEdgeIt& e) const {
665      if (e.out_or_in) return this->graph->tail(e); else
666        return this->graph->head(e); }
667    Node bNode(const OutEdgeIt& e) const {
668      if (e.out_or_in) return this->graph->head(e); else
669        return this->graph->tail(e); }
670  };
671 
[612]672  /// \brief An undirected graph template.
673  ///
674  /// An undirected graph template.
675  /// This class works as an undirected graph and a directed graph of
676  /// class \c Graph is used for the physical storage.
677  /// \ingroup graphs
[556]678  template<typename Graph>
679  class UndirGraph : public UndirGraphWrapper<Graph> {
680    typedef UndirGraphWrapper<Graph> Parent;
681  protected:
682    Graph gr;
683  public:
684    UndirGraph() : UndirGraphWrapper<Graph>() {
685      Parent::setGraph(gr);
686    }
687  };
688
[569]689
[650]690
691  ///\brief A wrapper for composing a subgraph of a
692  /// bidirected graph composed from a directed one.
[612]693  /// experimental, for fezso's sake.
694  ///
[650]695  /// A wrapper for composing a subgraps of a
696  /// bidirected graph composed from a directed one.
[576]697  /// experimental, for fezso's sake.
[612]698  /// A bidirected graph is composed over the directed one without physical
699  /// storage. As the oppositely directed edges are logically different ones
700  /// the maps are able to attach different values for them.
[650]701  template<typename Graph,
702           typename ForwardFilterMap, typename BackwardFilterMap>
703  class SubBidirGraphWrapper : public GraphWrapper<Graph> {
704  public:
705    typedef GraphWrapper<Graph> Parent;
[569]706  protected:
[650]707    ForwardFilterMap* forward_filter;
708    BackwardFilterMap* backward_filter;
709
710    SubBidirGraphWrapper() : GraphWrapper<Graph>()/*,
[569]711                                                 capacity(0), flow(0)*/ { }
[650]712    void setForwardFilterMap(ForwardFilterMap& _forward_filter) {
713      forward_filter=&_forward_filter;
714    }
715    void setBackwardFilterMap(BackwardFilterMap& _backward_filter) {
716      backward_filter=&_backward_filter;
717    }
[569]718
719  public:
720
[650]721    SubBidirGraphWrapper(Graph& _graph, ForwardFilterMap& _forward_filter,
722                         BackwardFilterMap& _backward_filter) :
723      GraphWrapper<Graph>(_graph),
724      forward_filter(&_forward_filter), backward_filter(&_backward_filter) { }
[774]725    SubBidirGraphWrapper(const SubBidirGraphWrapper<Graph,
726                         ForwardFilterMap, BackwardFilterMap>& gw) :
727      Parent(gw),
728      forward_filter(gw.forward_filter),
729      backward_filter(gw.backward_filter) { }
[569]730
731    class Edge;
732    class OutEdgeIt;
733    friend class Edge;
734    friend class OutEdgeIt;
735
[621]736    //template<typename T> class NodeMap;   
737    template<typename T> class EdgeMap;
738
[569]739    typedef typename GraphWrapper<Graph>::Node Node;
[774]740    //typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
[621]741
[774]742    typedef typename Graph::Edge GraphEdge;
[569]743    class Edge : public Graph::Edge {
[650]744      friend class SubBidirGraphWrapper<Graph,
745                                        ForwardFilterMap, BackwardFilterMap>;
[621]746      ///\bug ez nem is kell
747      //template<typename T> friend class NodeMap;
748      template<typename T> friend class EdgeMap;
[569]749    protected:
750      bool backward; //true, iff backward
751//      typename Graph::Edge e;
752    public:
753      Edge() { }
[626]754      ///\bug =false kell-e? zsoltnak kell az addEdge miatt
[774]755      Edge(const typename Graph::Edge& e, bool _backward/*=false*/) :
756        Graph::Edge(e), backward(_backward) { }
757      Edge(Invalid i) : Graph::Edge(i), backward(true) { }
[569]758//the unique invalid iterator
[774]759//       friend bool operator==(const Edge& u, const Edge& v) {
760//      return (u.backward==v.backward &&
761//              static_cast<typename Graph::Edge>(u)==
762//              static_cast<typename Graph::Edge>(v));
763//       }
764//       friend bool operator!=(const Edge& u, const Edge& v) {
765//      return (u.backward!=v.backward ||
766//              static_cast<typename Graph::Edge>(u)!=
767//              static_cast<typename Graph::Edge>(v));
768//       }
769      bool operator==(const Edge& v) const {
770        return (this->backward==v.backward &&
771                static_cast<typename Graph::Edge>(*this)==
[569]772                static_cast<typename Graph::Edge>(v));
773      }
[774]774      bool operator!=(const Edge& v) const {
775        return (this->backward!=v.backward ||
776                static_cast<typename Graph::Edge>(*this)!=
[569]777                static_cast<typename Graph::Edge>(v));
[774]778      }
[569]779    };
780
[774]781    class OutEdgeIt : public Edge {
[650]782      friend class SubBidirGraphWrapper<Graph,
783                                        ForwardFilterMap, BackwardFilterMap>;
[569]784    protected:
[774]785      const SubBidirGraphWrapper<Graph,
786                                 ForwardFilterMap, BackwardFilterMap>* gw;
[569]787    public:
788      OutEdgeIt() { }
[774]789      OutEdgeIt(Invalid i) : Edge(i) { }
[569]790//the unique invalid iterator
[650]791      OutEdgeIt(const SubBidirGraphWrapper<Graph,
[774]792                ForwardFilterMap, BackwardFilterMap>& _gw, const Node& n) :
793        Edge(typename Graph::OutEdgeIt(*(_gw.graph), n), false), gw(&_gw) {
794        while (*static_cast<GraphEdge*>(this)!=INVALID &&
795               !(*(gw->forward_filter))[*this])
796          *(static_cast<GraphEdge*>(this))=
797            ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
[775]798        if (*static_cast<GraphEdge*>(this)==INVALID) {
[774]799          *static_cast<Edge*>(this)=
800            Edge(typename Graph::InEdgeIt(*(_gw.graph), n), true);
[775]801          while (*static_cast<GraphEdge*>(this)!=INVALID &&
802                 !(*(gw->backward_filter))[*this])
803            *(static_cast<GraphEdge*>(this))=
804              ++(typename Graph::InEdgeIt(*(gw->graph), *this));
805        }
[774]806      }
807      OutEdgeIt(const SubBidirGraphWrapper<Graph,
808                ForwardFilterMap, BackwardFilterMap>& _gw, const Edge& e) :
809        Edge(e), gw(&_gw) { }
810      OutEdgeIt& operator++() {
811        if (!this->backward) {
812          Node n=gw->tail(*this);
813          *(static_cast<GraphEdge*>(this))=
814            ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
815          while (*static_cast<GraphEdge*>(this)!=INVALID &&
816                 !(*(gw->forward_filter))[*this])
817            *(static_cast<GraphEdge*>(this))=
818              ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
[775]819          if (*static_cast<GraphEdge*>(this)==INVALID) {
[774]820            *static_cast<Edge*>(this)=
821              Edge(typename Graph::InEdgeIt(*(gw->graph), n), true);
[775]822            while (*static_cast<GraphEdge*>(this)!=INVALID &&
823                   !(*(gw->backward_filter))[*this])
824              *(static_cast<GraphEdge*>(this))=
825                ++(typename Graph::InEdgeIt(*(gw->graph), *this));
826          }
[774]827        } else {
828          *(static_cast<GraphEdge*>(this))=
829            ++(typename Graph::InEdgeIt(*(gw->graph), *this));
830          while (*static_cast<GraphEdge*>(this)!=INVALID &&
831                 !(*(gw->backward_filter))[*this])
832            *(static_cast<GraphEdge*>(this))=
833              ++(typename Graph::InEdgeIt(*(gw->graph), *this));
[569]834        }
[774]835        return *this;
[569]836      }
837    };
838
[774]839    class InEdgeIt : public Edge {
[650]840      friend class SubBidirGraphWrapper<Graph,
841                                        ForwardFilterMap, BackwardFilterMap>;
[569]842    protected:
[774]843      const SubBidirGraphWrapper<Graph,
844                                 ForwardFilterMap, BackwardFilterMap>* gw;
[569]845    public:
846      InEdgeIt() { }
[774]847      InEdgeIt(Invalid i) : Edge(i) { }
[569]848//the unique invalid iterator
[650]849      InEdgeIt(const SubBidirGraphWrapper<Graph,
[774]850               ForwardFilterMap, BackwardFilterMap>& _gw, const Node& n) :
851        Edge(typename Graph::InEdgeIt(*(_gw.graph), n), false), gw(&_gw) {
852        while (*static_cast<GraphEdge*>(this)!=INVALID &&
853               !(*(gw->forward_filter))[*this])
854          *(static_cast<GraphEdge*>(this))=
855            ++(typename Graph::InEdgeIt(*(gw->graph), *this));
[775]856        if (*static_cast<GraphEdge*>(this)==INVALID) {
[774]857          *static_cast<Edge*>(this)=
858            Edge(typename Graph::OutEdgeIt(*(_gw.graph), n), true);
[775]859          while (*static_cast<GraphEdge*>(this)!=INVALID &&
860                 !(*(gw->backward_filter))[*this])
861            *(static_cast<GraphEdge*>(this))=
862              ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
863        }
[774]864      }
865      InEdgeIt(const SubBidirGraphWrapper<Graph,
866               ForwardFilterMap, BackwardFilterMap>& _gw, const Edge& e) :
867        Edge(e), gw(&_gw) { }
868      InEdgeIt& operator++() {
869        if (!this->backward) {
[775]870          Node n=gw->tail(*this);
[774]871          *(static_cast<GraphEdge*>(this))=
872            ++(typename Graph::InEdgeIt(*(gw->graph), *this));
873          while (*static_cast<GraphEdge*>(this)!=INVALID &&
874                 !(*(gw->forward_filter))[*this])
875            *(static_cast<GraphEdge*>(this))=
876              ++(typename Graph::InEdgeIt(*(gw->graph), *this));
[775]877          if (*static_cast<GraphEdge*>(this)==INVALID) {
[774]878            *static_cast<Edge*>(this)=
879              Edge(typename Graph::OutEdgeIt(*(gw->graph), n), true);
[775]880            while (*static_cast<GraphEdge*>(this)!=INVALID &&
881                   !(*(gw->backward_filter))[*this])
882              *(static_cast<GraphEdge*>(this))=
883                ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
884          }
[774]885        } else {
886          *(static_cast<GraphEdge*>(this))=
887            ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
888          while (*static_cast<GraphEdge*>(this)!=INVALID &&
889                 !(*(gw->backward_filter))[*this])
890            *(static_cast<GraphEdge*>(this))=
891              ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
[569]892        }
[774]893        return *this;
[569]894      }
895    };
896
[774]897    class EdgeIt : public Edge {
[650]898      friend class SubBidirGraphWrapper<Graph,
899                                        ForwardFilterMap, BackwardFilterMap>;
[569]900    protected:
[774]901      const SubBidirGraphWrapper<Graph,
902                                 ForwardFilterMap, BackwardFilterMap>* gw;
[569]903    public:
904      EdgeIt() { }
[774]905      EdgeIt(Invalid i) : Edge(i) { }
906//the unique invalid iterator
[650]907      EdgeIt(const SubBidirGraphWrapper<Graph,
[775]908             ForwardFilterMap, BackwardFilterMap>& _gw) :
909        Edge(typename Graph::OutEdgeIt(*(_gw.graph)), false), gw(&_gw) {
[774]910        while (*static_cast<GraphEdge*>(this)!=INVALID &&
911               !(*(gw->forward_filter))[*this])
912          *(static_cast<GraphEdge*>(this))=
913            ++(typename Graph::EdgeIt(*(gw->graph), *this));
[775]914        if (*static_cast<GraphEdge*>(this)==INVALID) {
[774]915          *static_cast<Edge*>(this)=
916            Edge(typename Graph::EdgeIt(*(_gw.graph)), true);
[775]917          while (*static_cast<GraphEdge*>(this)!=INVALID &&
918                 !(*(gw->backward_filter))[*this])
919            *(static_cast<GraphEdge*>(this))=
920              ++(typename Graph::EdgeIt(*(gw->graph), *this));
921        }
[774]922      }
923      EdgeIt(const SubBidirGraphWrapper<Graph,
924             ForwardFilterMap, BackwardFilterMap>& _gw, const Edge& e) :
925        Edge(e), gw(&_gw) { }
926      EdgeIt& operator++() {
927        if (!this->backward) {
928          *(static_cast<GraphEdge*>(this))=
929            ++(typename Graph::EdgeIt(*(gw->graph), *this));
930          while (*static_cast<GraphEdge*>(this)!=INVALID &&
931                 !(*(gw->forward_filter))[*this])
932            *(static_cast<GraphEdge*>(this))=
933              ++(typename Graph::EdgeIt(*(gw->graph), *this));
[775]934          if (*static_cast<GraphEdge*>(this)==INVALID) {
[774]935            *static_cast<Edge*>(this)=
936              Edge(typename Graph::EdgeIt(*(gw->graph)), true);
[775]937            while (*static_cast<GraphEdge*>(this)!=INVALID &&
938                   !(*(gw->backward_filter))[*this])
939              *(static_cast<GraphEdge*>(this))=
940                ++(typename Graph::EdgeIt(*(gw->graph), *this));
941          }
[774]942        } else {
943          *(static_cast<GraphEdge*>(this))=
944            ++(typename Graph::EdgeIt(*(gw->graph), *this));
945          while (*static_cast<GraphEdge*>(this)!=INVALID &&
946                 !(*(gw->backward_filter))[*this])
947            *(static_cast<GraphEdge*>(this))=
948              ++(typename Graph::EdgeIt(*(gw->graph), *this));
[569]949        }
[774]950        return *this;
[569]951      }
952    };
953
954    using GraphWrapper<Graph>::first;
955//     NodeIt& first(NodeIt& i) const {
956//       i=NodeIt(*this); return i;
957//     }
958    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
959      i=OutEdgeIt(*this, p); return i;
960    }
961//    FIXME not tested
962    InEdgeIt& first(InEdgeIt& i, const Node& p) const {
963      i=InEdgeIt(*this, p); return i;
964    }
965    EdgeIt& first(EdgeIt& i) const {
966      i=EdgeIt(*this); return i;
967    }
[556]968 
[774]969//     using GraphWrapper<Graph>::next;
970// //    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
971//     OutEdgeIt& next(OutEdgeIt& e) const {
972//       if (!e.backward) {
973//      Node v=this->graph->aNode(e.out);
974//      this->graph->next(e.out);
975//      while(this->graph->valid(e.out) && !(*forward_filter)[e]) {
976//        this->graph->next(e.out); }
977//      if (!this->graph->valid(e.out)) {
978//        e.backward=true;
979//        this->graph->first(e.in, v);
980//        while(this->graph->valid(e.in) && !(*backward_filter)[e]) {
981//          this->graph->next(e.in); }
982//      }
983//       } else {
984//      this->graph->next(e.in);
985//      while(this->graph->valid(e.in) && !(*backward_filter)[e]) {
986//        this->graph->next(e.in); }
987//       }
988//       return e;
989//     }
990// //     FIXME Not tested
991//     InEdgeIt& next(InEdgeIt& e) const {
992//       if (!e.backward) {
993//      Node v=this->graph->aNode(e.in);
994//      this->graph->next(e.in);
995//      while(this->graph->valid(e.in) && !(*forward_filter)[e]) {
996//        this->graph->next(e.in); }
997//      if (!this->graph->valid(e.in)) {
998//        e.backward=true;
999//        this->graph->first(e.out, v);
1000//        while(this->graph->valid(e.out) && !(*backward_filter)[e]) {
1001//          this->graph->next(e.out); }
1002//      }
1003//       } else {
1004//      this->graph->next(e.out);
1005//      while(this->graph->valid(e.out) && !(*backward_filter)[e]) {
1006//        this->graph->next(e.out); }
1007//       }
1008//       return e;
1009//     }
1010//     EdgeIt& next(EdgeIt& e) const {
1011//       if (!e.backward) {
1012//      this->graph->next(e.e);
1013//      while(this->graph->valid(e.e) && !(*forward_filter)[e]) {
1014//        this->graph->next(e.e); }
1015//      if (!this->graph->valid(e.e)) {
1016//        e.backward=true;
1017//        this->graph->first(e.e);
1018//        while(this->graph->valid(e.e) && !(*backward_filter)[e]) {
1019//          this->graph->next(e.e); }
1020//      }
1021//       } else {
1022//      this->graph->next(e.e);
1023//      while(this->graph->valid(e.e) && !(*backward_filter)[e]) {
1024//        this->graph->next(e.e); }
1025//       }
1026//       return e;
1027//     }
[569]1028
1029    Node tail(Edge e) const {
1030      return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
1031    Node head(Edge e) const {
1032      return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
1033
[774]1034//     Node aNode(OutEdgeIt e) const {
1035//       return ((!e.backward) ? this->graph->aNode(e.out) :
1036//            this->graph->aNode(e.in)); }
1037//     Node bNode(OutEdgeIt e) const {
1038//       return ((!e.backward) ? this->graph->bNode(e.out) :
1039//            this->graph->bNode(e.in)); }
[569]1040
[774]1041//     Node aNode(InEdgeIt e) const {
1042//       return ((!e.backward) ? this->graph->aNode(e.in) :
1043//            this->graph->aNode(e.out)); }
1044//     Node bNode(InEdgeIt e) const {
1045//       return ((!e.backward) ? this->graph->bNode(e.in) :
1046//            this->graph->bNode(e.out)); }
[569]1047
[572]1048    /// Gives back the opposite edge.
1049    Edge opposite(const Edge& e) const {
1050      Edge f=e;
1051      f.backward=!f.backward;
1052      return f;
1053    }
1054
[569]1055//    int nodeNum() const { return graph->nodeNum(); }
1056    //FIXME
1057    void edgeNum() const { }
1058    //int edgeNum() const { return graph->edgeNum(); }
1059
1060
1061//    int id(Node v) const { return graph->id(v); }
1062
[774]1063//     bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
1064//     bool valid(Edge e) const {
1065//       return this->graph->valid(e);
1066//      //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
1067//     }
[569]1068
1069    bool forward(const Edge& e) const { return !e.backward; }
1070    bool backward(const Edge& e) const { return e.backward; }
1071
1072//     void augment(const Edge& e, Number a) const {
1073//       if (!e.backward) 
1074// //   flow->set(e.out, flow->get(e.out)+a);
1075//      flow->set(e, (*flow)[e]+a);
1076//       else 
1077// //   flow->set(e.in, flow->get(e.in)-a);
1078//      flow->set(e, (*flow)[e]-a);
1079//     }
1080
[650]1081//     bool enabled(const Edge& e) const {
1082//       if (!e.backward)
1083// //   return (capacity->get(e.out)-flow->get(e.out));
1084//      //return ((*capacity)[e]-(*flow)[e]);
1085//      return true;
1086//       else
1087// //   return (flow->get(e.in));
1088//      //return ((*flow)[e]);
1089//      return true;
1090//     }
[569]1091
1092//     Number enabled(typename Graph::OutEdgeIt out) const {
1093// //      return (capacity->get(out)-flow->get(out));
1094//       return ((*capacity)[out]-(*flow)[out]);
1095//     }
1096   
1097//     Number enabled(typename Graph::InEdgeIt in) const {
1098// //      return (flow->get(in));
1099//       return ((*flow)[in]);
1100//     }
1101
1102    template <typename T>
1103    class EdgeMap {
1104      typename Graph::template EdgeMap<T> forward_map, backward_map;
1105    public:
[623]1106      typedef T ValueType;
1107      typedef Edge KeyType;
[650]1108      EdgeMap(const SubBidirGraphWrapper<Graph,
[774]1109              ForwardFilterMap, BackwardFilterMap>& g) :
1110        forward_map(*(g.graph)), backward_map(*(g.graph)) { }
[650]1111      EdgeMap(const SubBidirGraphWrapper<Graph,
[774]1112              ForwardFilterMap, BackwardFilterMap>& g, T a) :
1113        forward_map(*(g.graph), a), backward_map(*(g.graph), a) { }
[569]1114      void set(Edge e, T a) {
1115        if (!e.backward)
[622]1116          forward_map.set(e/*.out*/, a);
[569]1117        else
[622]1118          backward_map.set(e/*.in*/, a);
[569]1119      }
1120      T operator[](Edge e) const {
1121        if (!e.backward)
[622]1122          return forward_map[e/*.out*/];
[569]1123        else
[622]1124          return backward_map[e/*.in*/];
[569]1125      }
[625]1126      void update() {
1127        forward_map.update();
1128        backward_map.update();
1129      }
[569]1130//       T get(Edge e) const {
1131//      if (e.out_or_in)
1132//        return forward_map.get(e.out);
1133//      else
1134//        return backward_map.get(e.in);
1135//       }
1136    };
1137  };
1138
[650]1139
1140
1141  ///\brief A wrapper for composing bidirected graph from a directed one.
1142  /// experimental, for fezso's sake.
1143  ///
1144  /// A wrapper for composing bidirected graph from a directed one.
1145  /// experimental, for fezso's sake.
1146  /// A bidirected graph is composed over the directed one without physical
1147  /// storage. As the oppositely directed edges are logically different ones
1148  /// the maps are able to attach different values for them.
1149  template<typename Graph>
1150  class BidirGraphWrapper :
1151    public SubBidirGraphWrapper<
1152    Graph,
1153    ConstMap<typename Graph::Edge, bool>,
1154    ConstMap<typename Graph::Edge, bool> > {
1155  public:
1156    typedef  SubBidirGraphWrapper<
1157      Graph,
1158      ConstMap<typename Graph::Edge, bool>,
1159      ConstMap<typename Graph::Edge, bool> > Parent;
1160  protected:
1161    ConstMap<typename Graph::Edge, bool> cm;
1162    //const CapacityMap* capacity;
1163    //FlowMap* flow;
1164
[655]1165    BidirGraphWrapper() : Parent(), cm(true) {
1166      Parent::setForwardFilterMap(cm);
1167      Parent::setBackwardFilterMap(cm);
1168    }
[650]1169//     void setCapacityMap(const CapacityMap& _capacity) {
1170//       capacity=&_capacity;
1171//     }
1172//     void setFlowMap(FlowMap& _flow) {
1173//       flow=&_flow;
1174//     }
1175
1176  public:
1177
1178    BidirGraphWrapper(Graph& _graph) : Parent() {
1179      Parent::setGraph(_graph);
1180      Parent::setForwardFilterMap(cm);
1181      Parent::setBackwardFilterMap(cm);
1182    }
[738]1183
1184    int edgeNum() const {
1185      return 2*this->graph->edgeNum();
1186    }
[650]1187  };
1188
1189
1190
1191
[653]1192  template<typename Graph>
1193  class OldBidirGraphWrapper : public GraphWrapper<Graph> {
1194  public:
1195    typedef GraphWrapper<Graph> Parent;
1196  protected:
1197    //const CapacityMap* capacity;
1198    //FlowMap* flow;
[650]1199
[653]1200    OldBidirGraphWrapper() : GraphWrapper<Graph>()/*,
1201                                                 capacity(0), flow(0)*/ { }
1202//     void setCapacityMap(const CapacityMap& _capacity) {
1203//       capacity=&_capacity;
[650]1204//     }
[653]1205//     void setFlowMap(FlowMap& _flow) {
1206//       flow=&_flow;
[650]1207//     }
1208
[653]1209  public:
[650]1210
[653]1211    OldBidirGraphWrapper(Graph& _graph/*, const CapacityMap& _capacity,
1212                                     FlowMap& _flow*/) :
1213      GraphWrapper<Graph>(_graph)/*, capacity(&_capacity), flow(&_flow)*/ { }
[650]1214
[653]1215    class Edge;
1216    class OutEdgeIt;
1217    friend class Edge;
1218    friend class OutEdgeIt;
[650]1219
[653]1220    //template<typename T> class NodeMap;   
1221    template<typename T> class EdgeMap;
1222
1223    typedef typename GraphWrapper<Graph>::Node Node;
1224    typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
1225
1226    class Edge : public Graph::Edge {
1227      friend class OldBidirGraphWrapper<Graph>;
1228      ///\bug ez nem is kell
1229      //template<typename T> friend class NodeMap;
1230      template<typename T> friend class EdgeMap;
1231    protected:
1232      bool backward; //true, iff backward
1233//      typename Graph::Edge e;
1234    public:
1235      Edge() { }
1236      ///\bug =false kell-e? zsoltnak kell az addEdge miatt
1237      Edge(const typename Graph::Edge& _e, bool _backward=false) :
1238        Graph::Edge(_e), backward(_backward) { }
1239      Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
1240//the unique invalid iterator
1241      friend bool operator==(const Edge& u, const Edge& v) {
1242        return (v.backward==u.backward &&
1243                static_cast<typename Graph::Edge>(u)==
1244                static_cast<typename Graph::Edge>(v));
1245      }
1246      friend bool operator!=(const Edge& u, const Edge& v) {
1247        return (v.backward!=u.backward ||
1248                static_cast<typename Graph::Edge>(u)!=
1249                static_cast<typename Graph::Edge>(v));
1250      }
1251    };
1252
1253    class OutEdgeIt {
1254      friend class OldBidirGraphWrapper<Graph>;
1255    protected:
1256      typename Graph::OutEdgeIt out;
1257      typename Graph::InEdgeIt in;
1258      bool backward;
1259    public:
1260      OutEdgeIt() { }
1261      //FIXME
1262//      OutEdgeIt(const Edge& e) : Edge(e) { }
1263      OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
1264//the unique invalid iterator
1265      OutEdgeIt(const OldBidirGraphWrapper<Graph>& _G, Node v) {
1266        backward=false;
1267        _G.graph->first(out, v);
1268        while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
1269        if (!_G.graph->valid(out)) {
1270          backward=true;
1271          _G.graph->first(in, v);
1272          while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
1273        }
1274      }
1275      operator Edge() const {
1276//      Edge e;
1277//      e.forward=this->forward;
1278//      if (this->forward) e=out; else e=in;
1279//      return e;
1280        if (this->backward)
1281          return Edge(in, this->backward);
1282        else
1283          return Edge(out, this->backward);
1284      }
1285    };
1286
1287    class InEdgeIt {
1288      friend class OldBidirGraphWrapper<Graph>;
1289    protected:
1290      typename Graph::OutEdgeIt out;
1291      typename Graph::InEdgeIt in;
1292      bool backward;
1293    public:
1294      InEdgeIt() { }
1295      //FIXME
1296//      OutEdgeIt(const Edge& e) : Edge(e) { }
1297      InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
1298//the unique invalid iterator
1299      InEdgeIt(const OldBidirGraphWrapper<Graph>& _G, Node v) {
1300        backward=false;
1301        _G.graph->first(in, v);
1302        while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
1303        if (!_G.graph->valid(in)) {
1304          backward=true;
1305          _G.graph->first(out, v);
1306          while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
1307        }
1308      }
1309      operator Edge() const {
1310//      Edge e;
1311//      e.forward=this->forward;
1312//      if (this->forward) e=out; else e=in;
1313//      return e;
1314        if (this->backward)
1315          return Edge(out, this->backward);
1316        else
1317          return Edge(in, this->backward);
1318      }
1319    };
1320
1321    class EdgeIt {
1322      friend class OldBidirGraphWrapper<Graph>;
1323    protected:
1324      typename Graph::EdgeIt e;
1325      bool backward;
1326    public:
1327      EdgeIt() { }
1328      EdgeIt(const Invalid& i) : e(i), backward(true) { }
1329      EdgeIt(const OldBidirGraphWrapper<Graph>& _G) {
1330        backward=false;
1331        _G.graph->first(e);
1332        while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
1333        if (!_G.graph->valid(e)) {
1334          backward=true;
1335          _G.graph->first(e);
1336          while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
1337        }
1338      }
1339      operator Edge() const {
1340        return Edge(e, this->backward);
1341      }
1342    };
1343
1344    using GraphWrapper<Graph>::first;
1345//     NodeIt& first(NodeIt& i) const {
1346//       i=NodeIt(*this); return i;
1347//     }
1348    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1349      i=OutEdgeIt(*this, p); return i;
1350    }
1351//    FIXME not tested
1352    InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1353      i=InEdgeIt(*this, p); return i;
1354    }
1355    EdgeIt& first(EdgeIt& i) const {
1356      i=EdgeIt(*this); return i;
1357    }
1358 
1359    using GraphWrapper<Graph>::next;
1360//    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
1361    OutEdgeIt& next(OutEdgeIt& e) const {
1362      if (!e.backward) {
1363        Node v=this->graph->aNode(e.out);
1364        this->graph->next(e.out);
1365        while(this->graph->valid(e.out) && !enabled(e)) {
1366          this->graph->next(e.out); }
1367        if (!this->graph->valid(e.out)) {
1368          e.backward=true;
1369          this->graph->first(e.in, v);
1370          while(this->graph->valid(e.in) && !enabled(e)) {
1371            this->graph->next(e.in); }
1372        }
1373      } else {
1374        this->graph->next(e.in);
1375        while(this->graph->valid(e.in) && !enabled(e)) {
1376          this->graph->next(e.in); }
1377      }
1378      return e;
1379    }
1380//     FIXME Not tested
1381    InEdgeIt& next(InEdgeIt& e) const {
1382      if (!e.backward) {
1383        Node v=this->graph->aNode(e.in);
1384        this->graph->next(e.in);
1385        while(this->graph->valid(e.in) && !enabled(e)) {
1386          this->graph->next(e.in); }
1387        if (!this->graph->valid(e.in)) {
1388          e.backward=true;
1389          this->graph->first(e.out, v);
1390          while(this->graph->valid(e.out) && !enabled(e)) {
1391            this->graph->next(e.out); }
1392        }
1393      } else {
1394        this->graph->next(e.out);
1395        while(this->graph->valid(e.out) && !enabled(e)) {
1396          this->graph->next(e.out); }
1397      }
1398      return e;
1399    }
1400    EdgeIt& next(EdgeIt& e) const {
1401      if (!e.backward) {
1402        this->graph->next(e.e);
1403        while(this->graph->valid(e.e) && !enabled(e)) {
1404          this->graph->next(e.e); }
1405        if (!this->graph->valid(e.e)) {
1406          e.backward=true;
1407          this->graph->first(e.e);
1408          while(this->graph->valid(e.e) && !enabled(e)) {
1409            this->graph->next(e.e); }
1410        }
1411      } else {
1412        this->graph->next(e.e);
1413        while(this->graph->valid(e.e) && !enabled(e)) {
1414          this->graph->next(e.e); }
1415      }
1416      return e;
1417    }
1418
1419    Node tail(Edge e) const {
1420      return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
1421    Node head(Edge e) const {
1422      return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
1423
1424    Node aNode(OutEdgeIt e) const {
1425      return ((!e.backward) ? this->graph->aNode(e.out) :
1426              this->graph->aNode(e.in)); }
1427    Node bNode(OutEdgeIt e) const {
1428      return ((!e.backward) ? this->graph->bNode(e.out) :
1429              this->graph->bNode(e.in)); }
1430
1431    Node aNode(InEdgeIt e) const {
1432      return ((!e.backward) ? this->graph->aNode(e.in) :
1433              this->graph->aNode(e.out)); }
1434    Node bNode(InEdgeIt e) const {
1435      return ((!e.backward) ? this->graph->bNode(e.in) :
1436              this->graph->bNode(e.out)); }
1437
1438    /// Gives back the opposite edge.
1439    Edge opposite(const Edge& e) const {
1440      Edge f=e;
1441      f.backward=!f.backward;
1442      return f;
1443    }
1444
1445//    int nodeNum() const { return graph->nodeNum(); }
1446    //FIXME
1447    void edgeNum() const { }
1448    //int edgeNum() const { return graph->edgeNum(); }
1449
1450
1451//    int id(Node v) const { return graph->id(v); }
1452
1453    bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
1454    bool valid(Edge e) const {
1455      return this->graph->valid(e);
1456        //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
1457    }
1458
1459    bool forward(const Edge& e) const { return !e.backward; }
1460    bool backward(const Edge& e) const { return e.backward; }
1461
1462//     void augment(const Edge& e, Number a) const {
1463//       if (!e.backward) 
1464// //   flow->set(e.out, flow->get(e.out)+a);
1465//      flow->set(e, (*flow)[e]+a);
1466//       else 
1467// //   flow->set(e.in, flow->get(e.in)-a);
1468//      flow->set(e, (*flow)[e]-a);
[650]1469//     }
1470
[653]1471    bool enabled(const Edge& e) const {
1472      if (!e.backward)
1473//      return (capacity->get(e.out)-flow->get(e.out));
1474        //return ((*capacity)[e]-(*flow)[e]);
1475        return true;
1476      else
1477//      return (flow->get(e.in));
1478        //return ((*flow)[e]);
1479        return true;
1480    }
[650]1481
[653]1482//     Number enabled(typename Graph::OutEdgeIt out) const {
1483// //      return (capacity->get(out)-flow->get(out));
1484//       return ((*capacity)[out]-(*flow)[out]);
1485//     }
1486   
1487//     Number enabled(typename Graph::InEdgeIt in) const {
1488// //      return (flow->get(in));
1489//       return ((*flow)[in]);
[650]1490//     }
1491
[653]1492    template <typename T>
1493    class EdgeMap {
1494      typename Graph::template EdgeMap<T> forward_map, backward_map;
1495    public:
1496      typedef T ValueType;
1497      typedef Edge KeyType;
1498      EdgeMap(const OldBidirGraphWrapper<Graph>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
1499      EdgeMap(const OldBidirGraphWrapper<Graph>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
1500      void set(Edge e, T a) {
1501        if (!e.backward)
1502          forward_map.set(e/*.out*/, a);
1503        else
1504          backward_map.set(e/*.in*/, a);
1505      }
1506      T operator[](Edge e) const {
1507        if (!e.backward)
1508          return forward_map[e/*.out*/];
1509        else
1510          return backward_map[e/*.in*/];
1511      }
1512      void update() {
1513        forward_map.update();
1514        backward_map.update();
1515      }
1516//       T get(Edge e) const {
1517//      if (e.out_or_in)
1518//        return forward_map.get(e.out);
1519//      else
1520//        return backward_map.get(e.in);
1521//       }
1522    };
1523  };
[650]1524
1525
1526
[612]1527  /// \brief A bidirected graph template.
1528  ///
1529  /// A bidirected graph template.
1530  /// Such a bidirected graph stores each pair of oppositely directed edges
1531  /// ones in the memory, i.e. a directed graph of type
1532  /// \c Graph is used for that.
1533  /// As the oppositely directed edges are logically different ones
1534  /// the maps are able to attach different values for them.
1535  /// \ingroup graphs
1536  template<typename Graph>
1537  class BidirGraph : public BidirGraphWrapper<Graph> {
[650]1538  public:
[612]1539    typedef UndirGraphWrapper<Graph> Parent;
1540  protected:
1541    Graph gr;
1542  public:
1543    BidirGraph() : BidirGraphWrapper<Graph>() {
1544      Parent::setGraph(gr);
1545    }
1546  };
[569]1547
[556]1548
[650]1549
1550  template<typename Graph, typename Number,
1551           typename CapacityMap, typename FlowMap>
[658]1552  class ResForwardFilter {
1553    //    const Graph* graph;
[650]1554    const CapacityMap* capacity;
1555    const FlowMap* flow;
1556  public:
[658]1557    ResForwardFilter(/*const Graph& _graph, */
1558                     const CapacityMap& _capacity, const FlowMap& _flow) :
1559      /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
1560    ResForwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
1561    //void setGraph(const Graph& _graph) { graph=&_graph; }
[656]1562    void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
1563    void setFlow(const FlowMap& _flow) { flow=&_flow; }
[650]1564    bool operator[](const typename Graph::Edge& e) const {
[738]1565      return (Number((*flow)[e]) < Number((*capacity)[e]));
[650]1566    }
1567  };
1568
1569  template<typename Graph, typename Number,
1570           typename CapacityMap, typename FlowMap>
[658]1571  class ResBackwardFilter {
1572    //const Graph* graph;
[650]1573    const CapacityMap* capacity;
1574    const FlowMap* flow;
1575  public:
[658]1576    ResBackwardFilter(/*const Graph& _graph,*/
1577                      const CapacityMap& _capacity, const FlowMap& _flow) :
1578      /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
1579    ResBackwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
1580    //void setGraph(const Graph& _graph) { graph=&_graph; }
[656]1581    void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
1582    void setFlow(const FlowMap& _flow) { flow=&_flow; }
[650]1583    bool operator[](const typename Graph::Edge& e) const {
[738]1584      return (Number(0) < Number((*flow)[e]));
[650]1585    }
1586  };
1587
[653]1588 
1589  /// A wrapper for composing the residual graph for directed flow and circulation problems.
[650]1590
[653]1591  /// A wrapper for composing the residual graph for directed flow and circulation problems.
[650]1592  template<typename Graph, typename Number,
1593           typename CapacityMap, typename FlowMap>
[653]1594  class ResGraphWrapper :
[650]1595    public SubBidirGraphWrapper<
1596    Graph,
[658]1597    ResForwardFilter<Graph, Number, CapacityMap, FlowMap>, 
1598    ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > {
[650]1599  public:
1600    typedef SubBidirGraphWrapper<
1601      Graph,
[658]1602      ResForwardFilter<Graph, Number, CapacityMap, FlowMap>, 
1603      ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent;
[650]1604  protected:
1605    const CapacityMap* capacity;
1606    FlowMap* flow;
[658]1607    ResForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter;
1608    ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter;
1609    ResGraphWrapper() : Parent(),
1610                        capacity(0), flow(0) { }
1611    void setCapacityMap(const CapacityMap& _capacity) {
1612      capacity=&_capacity;
1613      forward_filter.setCapacity(_capacity);
1614      backward_filter.setCapacity(_capacity);
1615    }
1616    void setFlowMap(FlowMap& _flow) {
1617      flow=&_flow;
1618      forward_filter.setFlow(_flow);
1619      backward_filter.setFlow(_flow);
1620    }
1621//     /// \bug does graph reference needed in filtermaps??
1622//     void setGraph(const Graph& _graph) {
1623//       Parent::setGraph(_graph);
1624//       forward_filter.setGraph(_graph);
1625//       backward_filter.setGraph(_graph);
[656]1626//     }
[650]1627  public:
[653]1628    ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
[650]1629                       FlowMap& _flow) :
1630      Parent(), capacity(&_capacity), flow(&_flow),
[658]1631      forward_filter(/*_graph,*/ _capacity, _flow),
1632      backward_filter(/*_graph,*/ _capacity, _flow) {
[650]1633      Parent::setGraph(_graph);
1634      Parent::setForwardFilterMap(forward_filter);
1635      Parent::setBackwardFilterMap(backward_filter);
1636    }
1637
[660]1638    typedef typename Parent::Edge Edge;
1639
[650]1640    //    bool forward(const Parent::Edge& e) const { return Parent::forward(e); }
1641    //bool backward(const Edge& e) const { return e.backward; }
1642
[660]1643    void augment(const Edge& e, Number a) const {
[650]1644      if (Parent::forward(e)) 
1645//      flow->set(e.out, flow->get(e.out)+a);
1646        flow->set(e, (*flow)[e]+a);
1647      else 
1648        //flow->set(e.in, flow->get(e.in)-a);
1649        flow->set(e, (*flow)[e]-a);
1650    }
1651
[660]1652    /// \deprecated
1653    ///
1654    Number resCap(const Edge& e) const {
[650]1655      if (Parent::forward(e))
1656//      return (capacity->get(e.out)-flow->get(e.out));
1657        return ((*capacity)[e]-(*flow)[e]);
1658      else
1659//      return (flow->get(e.in));
1660        return ((*flow)[e]);
1661    }
1662
[660]1663    /// \brief Residual capacity map.
1664    ///
1665    /// In generic residual graphs the residual capacity can be obtained as a map.
1666    class ResCap {
1667    protected:
1668      const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>* res_graph;
1669    public:
1670      typedef Number ValueType;
1671      typedef Edge KeyType;
1672      ResCap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _res_graph) :
1673        res_graph(&_res_graph) { }
1674      Number operator[](const Edge& e) const {
1675        if (res_graph->forward(e))
1676          //    return (capacity->get(e.out)-flow->get(e.out));
1677          return (*(res_graph->capacity))[e]-(*(res_graph->flow))[e];
1678        else
1679          //    return (flow->get(e.in));
1680          return (*(res_graph->flow))[e];
1681      }
1682      /// \bug not needed with dynamic maps, or does it?
1683      void update() { }
1684    };
1685
[650]1686  };
1687
1688
[556]1689  template<typename Graph, typename Number,
1690           typename CapacityMap, typename FlowMap>
[653]1691  class OldResGraphWrapper : public GraphWrapper<Graph> {
[650]1692  public:
1693    typedef GraphWrapper<Graph> Parent;
[556]1694  protected:
1695    const CapacityMap* capacity;
1696    FlowMap* flow;
1697
[653]1698    OldResGraphWrapper() : GraphWrapper<Graph>(0),
[556]1699                        capacity(0), flow(0) { }
[560]1700    void setCapacityMap(const CapacityMap& _capacity) {
1701      capacity=&_capacity;
[556]1702    }
1703    void setFlowMap(FlowMap& _flow) {
1704      flow=&_flow;
1705    }
1706
1707  public:
1708
[653]1709    OldResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,
[556]1710                    FlowMap& _flow) :
1711      GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
1712
1713    class Edge;
1714    class OutEdgeIt;
1715    friend class Edge;
1716    friend class OutEdgeIt;
1717
1718    typedef typename GraphWrapper<Graph>::Node Node;
1719    typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
1720    class Edge : public Graph::Edge {
[653]1721      friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
[556]1722    protected:
[565]1723      bool backward; //true, iff backward
[556]1724//      typename Graph::Edge e;
1725    public:
1726      Edge() { }
[565]1727      Edge(const typename Graph::Edge& _e, bool _backward) :
1728        Graph::Edge(_e), backward(_backward) { }
1729      Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
[556]1730//the unique invalid iterator
1731      friend bool operator==(const Edge& u, const Edge& v) {
[565]1732        return (v.backward==u.backward &&
[556]1733                static_cast<typename Graph::Edge>(u)==
1734                static_cast<typename Graph::Edge>(v));
1735      }
1736      friend bool operator!=(const Edge& u, const Edge& v) {
[565]1737        return (v.backward!=u.backward ||
[556]1738                static_cast<typename Graph::Edge>(u)!=
1739                static_cast<typename Graph::Edge>(v));
1740      }
1741    };
1742
1743    class OutEdgeIt {
[653]1744      friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
[556]1745    protected:
1746      typename Graph::OutEdgeIt out;
1747      typename Graph::InEdgeIt in;
[565]1748      bool backward;
[556]1749    public:
1750      OutEdgeIt() { }
1751      //FIXME
1752//      OutEdgeIt(const Edge& e) : Edge(e) { }
[565]1753      OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
[556]1754//the unique invalid iterator
[653]1755      OutEdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) {
[565]1756        backward=false;
[569]1757        _G.graph->first(out, v);
1758        while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
1759        if (!_G.graph->valid(out)) {
[565]1760          backward=true;
[569]1761          _G.graph->first(in, v);
1762          while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
[556]1763        }
1764      }
1765      operator Edge() const {
1766//      Edge e;
1767//      e.forward=this->forward;
1768//      if (this->forward) e=out; else e=in;
1769//      return e;
[565]1770        if (this->backward)
1771          return Edge(in, this->backward);
[556]1772        else
[565]1773          return Edge(out, this->backward);
[556]1774      }
1775    };
1776
1777    class InEdgeIt {
[653]1778      friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
[556]1779    protected:
1780      typename Graph::OutEdgeIt out;
1781      typename Graph::InEdgeIt in;
[565]1782      bool backward;
[556]1783    public:
1784      InEdgeIt() { }
1785      //FIXME
1786//      OutEdgeIt(const Edge& e) : Edge(e) { }
[565]1787      InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
[556]1788//the unique invalid iterator
[653]1789      InEdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) {
[565]1790        backward=false;
[569]1791        _G.graph->first(in, v);
1792        while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
1793        if (!_G.graph->valid(in)) {
[565]1794          backward=true;
[569]1795          _G.graph->first(out, v);
1796          while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
[556]1797        }
1798      }
1799      operator Edge() const {
1800//      Edge e;
1801//      e.forward=this->forward;
1802//      if (this->forward) e=out; else e=in;
1803//      return e;
[565]1804        if (this->backward)
1805          return Edge(out, this->backward);
[556]1806        else
[565]1807          return Edge(in, this->backward);
[556]1808      }
1809    };
1810
1811    class EdgeIt {
[653]1812      friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
[556]1813    protected:
1814      typename Graph::EdgeIt e;
[565]1815      bool backward;
[556]1816    public:
1817      EdgeIt() { }
[565]1818      EdgeIt(const Invalid& i) : e(i), backward(true) { }
[653]1819      EdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) {
[565]1820        backward=false;
[569]1821        _G.graph->first(e);
1822        while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
1823        if (!_G.graph->valid(e)) {
[565]1824          backward=true;
[569]1825          _G.graph->first(e);
1826          while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
[556]1827        }
1828      }
1829      operator Edge() const {
[565]1830        return Edge(e, this->backward);
[556]1831      }
1832    };
1833
1834    using GraphWrapper<Graph>::first;
1835//     NodeIt& first(NodeIt& i) const {
1836//       i=NodeIt(*this); return i;
1837//     }
1838    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1839      i=OutEdgeIt(*this, p); return i;
1840    }
1841//    FIXME not tested
1842    InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1843      i=InEdgeIt(*this, p); return i;
1844    }
1845    EdgeIt& first(EdgeIt& i) const {
1846      i=EdgeIt(*this); return i;
1847    }
1848 
1849    using GraphWrapper<Graph>::next;
1850//    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
1851    OutEdgeIt& next(OutEdgeIt& e) const {
[565]1852      if (!e.backward) {
[556]1853        Node v=this->graph->aNode(e.out);
1854        this->graph->next(e.out);
1855        while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
1856          this->graph->next(e.out); }
1857        if (!this->graph->valid(e.out)) {
[565]1858          e.backward=true;
[556]1859          this->graph->first(e.in, v);
1860          while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
1861            this->graph->next(e.in); }
1862        }
1863      } else {
1864        this->graph->next(e.in);
1865        while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
1866          this->graph->next(e.in); }
1867      }
1868      return e;
1869    }
1870//     FIXME Not tested
1871    InEdgeIt& next(InEdgeIt& e) const {
[565]1872      if (!e.backward) {
[556]1873        Node v=this->graph->aNode(e.in);
1874        this->graph->next(e.in);
1875        while( this->graph->valid(e.in) && !(resCap(e)>0) ) {
1876          this->graph->next(e.in); }
1877        if (!this->graph->valid(e.in)) {
[565]1878          e.backward=true;
[556]1879          this->graph->first(e.out, v);
1880          while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
1881            this->graph->next(e.out); }
1882        }
1883      } else {
1884        this->graph->next(e.out);
1885        while( this->graph->valid(e.out) && !(resCap(e)>0) ) {
1886          this->graph->next(e.out); }
1887      }
1888      return e;
1889    }
1890    EdgeIt& next(EdgeIt& e) const {
[565]1891      if (!e.backward) {
[556]1892        this->graph->next(e.e);
1893        while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
1894          this->graph->next(e.e); }
1895        if (!this->graph->valid(e.e)) {
[565]1896          e.backward=true;
[556]1897          this->graph->first(e.e);
1898          while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
1899            this->graph->next(e.e); }
1900        }
1901      } else {
1902        this->graph->next(e.e);
1903        while( this->graph->valid(e.e) && !(resCap(e)>0) ) {
1904          this->graph->next(e.e); }
1905      }
1906      return e;
1907    }
1908
1909    Node tail(Edge e) const {
[565]1910      return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
[556]1911    Node head(Edge e) const {
[565]1912      return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
[556]1913
1914    Node aNode(OutEdgeIt e) const {
[565]1915      return ((!e.backward) ? this->graph->aNode(e.out) :
[556]1916              this->graph->aNode(e.in)); }
1917    Node bNode(OutEdgeIt e) const {
[565]1918      return ((!e.backward) ? this->graph->bNode(e.out) :
[556]1919              this->graph->bNode(e.in)); }
1920
1921    Node aNode(InEdgeIt e) const {
[565]1922      return ((!e.backward) ? this->graph->aNode(e.in) :
[556]1923              this->graph->aNode(e.out)); }
1924    Node bNode(InEdgeIt e) const {
[565]1925      return ((!e.backward) ? this->graph->bNode(e.in) :
[556]1926              this->graph->bNode(e.out)); }
1927
1928//    int nodeNum() const { return graph->nodeNum(); }
1929    //FIXME
1930    void edgeNum() const { }
1931    //int edgeNum() const { return graph->edgeNum(); }
1932
1933
1934//    int id(Node v) const { return graph->id(v); }
1935
1936    bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
1937    bool valid(Edge e) const {
1938      return this->graph->valid(e);
1939        //return e.forward ? graph->valid(e.out) : graph->valid(e.in);
1940    }
1941
[565]1942    bool forward(const Edge& e) const { return !e.backward; }
1943    bool backward(const Edge& e) const { return e.backward; }
[556]1944
1945    void augment(const Edge& e, Number a) const {
[565]1946      if (!e.backward) 
[556]1947//      flow->set(e.out, flow->get(e.out)+a);
1948        flow->set(e, (*flow)[e]+a);
1949      else 
1950//      flow->set(e.in, flow->get(e.in)-a);
1951        flow->set(e, (*flow)[e]-a);
1952    }
1953
1954    Number resCap(const Edge& e) const {
[565]1955      if (!e.backward)
[556]1956//      return (capacity->get(e.out)-flow->get(e.out));
1957        return ((*capacity)[e]-(*flow)[e]);
1958      else
1959//      return (flow->get(e.in));
1960        return ((*flow)[e]);
1961    }
1962
1963//     Number resCap(typename Graph::OutEdgeIt out) const {
1964// //      return (capacity->get(out)-flow->get(out));
1965//       return ((*capacity)[out]-(*flow)[out]);
1966//     }
1967   
1968//     Number resCap(typename Graph::InEdgeIt in) const {
1969// //      return (flow->get(in));
1970//       return ((*flow)[in]);
1971//     }
1972
1973    template <typename T>
1974    class EdgeMap {
1975      typename Graph::template EdgeMap<T> forward_map, backward_map;
1976    public:
[624]1977      typedef T ValueType;
1978      typedef Edge KeyType;
[653]1979      EdgeMap(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
1980      EdgeMap(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
[556]1981      void set(Edge e, T a) {
[565]1982        if (!e.backward)
[624]1983          forward_map.set(e/*.out*/, a);
[556]1984        else
[624]1985          backward_map.set(e/*.in*/, a);
[556]1986      }
1987      T operator[](Edge e) const {
[565]1988        if (!e.backward)
[624]1989          return forward_map[e/*.out*/];
[556]1990        else
[624]1991          return backward_map[e/*.in*/];
[556]1992      }
[625]1993      void update() {
1994        forward_map.update();
1995        backward_map.update();
1996      }
[556]1997//       T get(Edge e) const {
1998//      if (e.out_or_in)
1999//        return forward_map.get(e.out);
2000//      else
2001//        return backward_map.get(e.in);
2002//       }
2003    };
2004  };
2005
[569]2006
2007
[612]2008  /// For blocking flows.
[556]2009
[612]2010  /// This graph wrapper is used for Dinits blocking flow computations.
2011  /// For each node, an out-edge is stored which is used when the
2012  /// \code
2013  /// OutEdgeIt& first(OutEdgeIt&, const Node&)
2014  /// \endcode
2015  /// is called.
[556]2016  ///
2017  ///\author Marton Makai
2018  template<typename Graph, typename FirstOutEdgesMap>
2019  class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
[650]2020  public:
2021    typedef GraphWrapper<Graph> Parent;
[556]2022  protected:
2023    FirstOutEdgesMap* first_out_edges;
2024  public:
2025    ErasingFirstGraphWrapper(Graph& _graph,
2026                             FirstOutEdgesMap& _first_out_edges) :
2027      GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { } 
2028
2029    typedef typename GraphWrapper<Graph>::Node Node;
2030//     class NodeIt {
2031//       friend class GraphWrapper<Graph>;
2032//       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
2033//       typename Graph::NodeIt n;
2034//      public:
2035//       NodeIt() { }
2036//       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
2037//       NodeIt(const Invalid& i) : n(i) { }
2038//       NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
2039//      n(*(_G.graph)) { }
2040//       operator Node() const { return Node(typename Graph::Node(n)); }
2041//     };
2042    typedef typename GraphWrapper<Graph>::Edge Edge;
[777]2043    class OutEdgeIt : public Edge {
[556]2044      friend class GraphWrapper<Graph>;
2045      friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
[777]2046      const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>* gw;
[556]2047    public:
2048      OutEdgeIt() { }
[777]2049      //OutEdgeIt(const OutEdgeIt& e) : Edge(e), gw(e.gw) { }
2050      OutEdgeIt(Invalid i) : Edge(i) { }
2051      OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _gw,
2052                const Node& n) :
2053        Edge((*(_gw.first_out_edges))[n]), gw(&_gw) { }
2054      OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _gw,
2055                const Edge& e) :
2056        Edge(e), gw(&_gw) { }
2057      OutEdgeIt& operator++() {
2058        *(static_cast<Edge*>(this))=
2059          ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
2060        return *this;
2061      }
[556]2062    };
[777]2063//     class InEdgeIt {
2064//       friend class GraphWrapper<Graph>;
2065//       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
2066// //      typedef typename Graph::InEdgeIt GraphInEdgeIt;
2067//       typename Graph::InEdgeIt e;
2068//     public:
2069//       InEdgeIt() { }
2070//       InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
2071//       InEdgeIt(const Invalid& i) : e(i) { }
2072//       InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
2073//             const Node& _n) :
2074//      e(*(_G.graph), typename Graph::Node(_n)) { }
2075//       operator Edge() const { return Edge(typename Graph::Edge(e)); }
2076//     };       
[556]2077    //typedef typename Graph::SymEdgeIt SymEdgeIt;
[777]2078//     class EdgeIt {
2079//       friend class GraphWrapper<Graph>;
2080//       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
2081// //      typedef typename Graph::EdgeIt GraphEdgeIt;
2082//       typename Graph::EdgeIt e;
2083//     public:
2084//       EdgeIt() { }
2085//       EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
2086//       EdgeIt(const Invalid& i) : e(i) { }
2087//       EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
2088//      e(*(_G.graph)) { }
2089//       operator Edge() const { return Edge(typename Graph::Edge(e)); }
2090//     };
[556]2091
2092    using GraphWrapper<Graph>::first;
2093//     NodeIt& first(NodeIt& i) const {
2094//       i=NodeIt(*this); return i;
2095//     }
2096    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
2097      i=OutEdgeIt(*this, p); return i;
2098    }
[777]2099//     InEdgeIt& first(InEdgeIt& i, const Node& p) const {
2100//       i=InEdgeIt(*this, p); return i;
2101//     }
2102//     EdgeIt& first(EdgeIt& i) const {
2103//       i=EdgeIt(*this); return i;
2104//     }
[556]2105
[777]2106//     using GraphWrapper<Graph>::next;
2107// //    NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
2108//     OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
2109//     InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
2110//     EdgeIt& next(EdgeIt& i) const { this->graph->next(i.e); return i; }   
[556]2111   
[777]2112//     Node aNode(const OutEdgeIt& e) const {
2113//       return Node(this->graph->aNode(e.e)); }
2114//     Node aNode(const InEdgeIt& e) const {
2115//       return Node(this->graph->aNode(e.e)); }
2116//     Node bNode(const OutEdgeIt& e) const {
2117//       return Node(this->graph->bNode(e.e)); }
2118//     Node bNode(const InEdgeIt& e) const {
2119//       return Node(this->graph->bNode(e.e)); }
[556]2120
[777]2121    void erase(const Edge& e) const {
2122      Node n=tail(e);
2123      typename Graph::OutEdgeIt f(*graph, n);
2124      ++f;
2125      first_out_edges->set(n, f);
[556]2126    }
2127  };
2128
2129  ///@}
2130
2131} //namespace hugo
2132
2133#endif //HUGO_GRAPH_WRAPPER_H
2134
Note: See TracBrowser for help on using the repository browser.