| 
     1 // -*- c++ -*-  | 
         | 
     2 #ifndef HUGO_GRAPH_WRAPPER_H  | 
         | 
     3 #define HUGO_GRAPH_WRAPPER_H  | 
         | 
     4   | 
         | 
     5 #include <invalid.h>  | 
         | 
     6 #include <iter_map.h>  | 
         | 
     7   | 
         | 
     8 namespace hugo { | 
         | 
     9   | 
         | 
    10   // Graph wrappers  | 
         | 
    11   | 
         | 
    12   /// \addtogroup gwrappers  | 
         | 
    13   /// A main parts of HUGOlib are the different graph structures,   | 
         | 
    14   /// generic graph algorithms, graph concepts which couple these, and   | 
         | 
    15   /// graph wrappers. While the previous ones are more or less clear, the   | 
         | 
    16   /// latter notion needs further explanation.  | 
         | 
    17   /// Graph wrappers are graph classes which serve for considering graph   | 
         | 
    18   /// structures in different ways. A short example makes the notion much   | 
         | 
    19   /// clearer.   | 
         | 
    20   /// Suppose that we have an instance \c g of a directed graph  | 
         | 
    21   /// type say \c ListGraph and an algorithm   | 
         | 
    22   /// \code template<typename Graph> int algorithm(const Graph&); \endcode   | 
         | 
    23   /// is needed to run on the reversely oriented graph.   | 
         | 
    24   /// It may be expensive (in time or in memory usage) to copy   | 
         | 
    25   /// \c g with the reverse orientation.   | 
         | 
    26   /// Thus, a wrapper class  | 
         | 
    27   /// \code template<typename Graph> class RevGraphWrapper; \endcode is used.   | 
         | 
    28   /// The code looks as follows  | 
         | 
    29   /// \code  | 
         | 
    30   /// ListGraph g;  | 
         | 
    31   /// RevGraphWrapper<ListGraph> rgw(g);  | 
         | 
    32   /// int result=algorithm(rgw);  | 
         | 
    33   /// \endcode  | 
         | 
    34   /// After running the algorithm, the original graph \c g   | 
         | 
    35   /// remains untouched. Thus the graph wrapper used above is to consider the   | 
         | 
    36   /// original graph with reverse orientation.   | 
         | 
    37   /// This techniques gives rise to an elegant code, and   | 
         | 
    38   /// based on stable graph wrappers, complex algorithms can be   | 
         | 
    39   /// implemented easily.   | 
         | 
    40   /// In flow, circulation and bipartite matching problems, the residual   | 
         | 
    41   /// graph is of particular importance. Combining a wrapper implementing   | 
         | 
    42   /// this, shortest path algorithms and minimum mean cycle algorithms,   | 
         | 
    43   /// a range of weighted and cardinality optimization algorithms can be   | 
         | 
    44   /// obtained. For lack of space, for other examples,   | 
         | 
    45   /// the interested user is referred to the detailed documentation of graph   | 
         | 
    46   /// wrappers.   | 
         | 
    47   /// The behavior of graph wrappers can be very different. Some of them keep   | 
         | 
    48   /// capabilities of the original graph while in other cases this would be   | 
         | 
    49   /// meaningless. This means that the concepts that they are a model of depend   | 
         | 
    50   /// on the graph wrapper, and the wrapped graph(s).   | 
         | 
    51   /// If an edge of \c rgw is deleted, this is carried out by   | 
         | 
    52   /// deleting the corresponding edge of \c g. But for a residual   | 
         | 
    53   /// graph, this operation has no sense.   | 
         | 
    54   /// Let we stand one more example here to simplify your work.   | 
         | 
    55   /// wrapper class  | 
         | 
    56   /// \code template<typename Graph> class RevGraphWrapper; \endcode   | 
         | 
    57   /// has constructor   | 
         | 
    58   /// <tt> RevGraphWrapper(Graph& _g)</tt>.   | 
         | 
    59   /// This means that in a situation,   | 
         | 
    60   /// when a <tt> const ListGraph& </tt> reference to a graph is given,   | 
         | 
    61   /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.  | 
         | 
    62   /// \code  | 
         | 
    63   /// int algorithm1(const ListGraph& g) { | 
         | 
    64   ///   RevGraphWrapper<const ListGraph> rgw(g);  | 
         | 
    65   ///   return algorithm2(rgw);  | 
         | 
    66   /// }  | 
         | 
    67   /// \endcode  | 
         | 
    68   | 
         | 
    69   /// \addtogroup gwrappers  | 
         | 
    70   /// @{ | 
         | 
    71   | 
         | 
    72   ///Base type for the Graph Wrappers  | 
         | 
    73   | 
         | 
    74   ///This is the base type for the Graph Wrappers.  | 
         | 
    75   ///\todo Some more docs...  | 
         | 
    76   | 
         | 
    77   template<typename Graph>  | 
         | 
    78   class GraphWrapper { | 
         | 
    79   protected:  | 
         | 
    80     Graph* graph;  | 
         | 
    81     | 
         | 
    82   public:  | 
         | 
    83     typedef Graph BaseGraph;  | 
         | 
    84     typedef Graph ParentGraph;  | 
         | 
    85   | 
         | 
    86 //     GraphWrapper() : graph(0) { } | 
         | 
    87     GraphWrapper(Graph& _graph) : graph(&_graph) { } | 
         | 
    88 //     void setGraph(Graph& _graph) { graph=&_graph; } | 
         | 
    89 //     Graph& getGraph() const { return *graph; } | 
         | 
    90    | 
         | 
    91 //    typedef typename Graph::Node Node;  | 
         | 
    92     class Node : public Graph::Node { | 
         | 
    93       friend class GraphWrapper<Graph>;  | 
         | 
    94     public:  | 
         | 
    95       Node() { } | 
         | 
    96       Node(const typename Graph::Node& _n) : Graph::Node(_n) { } | 
         | 
    97       Node(const Invalid& i) : Graph::Node(i) { } | 
         | 
    98     };  | 
         | 
    99     class NodeIt {  | 
         | 
   100       friend class GraphWrapper<Graph>;  | 
         | 
   101       typename Graph::NodeIt n;  | 
         | 
   102      public:  | 
         | 
   103       NodeIt() { } | 
         | 
   104       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { } | 
         | 
   105       NodeIt(const Invalid& i) : n(i) { } | 
         | 
   106       NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { } | 
         | 
   107       operator Node() const { return Node(typename Graph::Node(n)); } | 
         | 
   108     };  | 
         | 
   109 //    typedef typename Graph::Edge Edge;  | 
         | 
   110     class Edge : public Graph::Edge { | 
         | 
   111       friend class GraphWrapper<Graph>;  | 
         | 
   112     public:  | 
         | 
   113       Edge() { } | 
         | 
   114       Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { } | 
         | 
   115       Edge(const Invalid& i) : Graph::Edge(i) { } | 
         | 
   116     };  | 
         | 
   117     class OutEdgeIt {  | 
         | 
   118       friend class GraphWrapper<Graph>;  | 
         | 
   119       typename Graph::OutEdgeIt e;  | 
         | 
   120     public:  | 
         | 
   121       OutEdgeIt() { } | 
         | 
   122       OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { } | 
         | 
   123       OutEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   124       OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :   | 
         | 
   125 	e(*(_G.graph), typename Graph::Node(_n)) { } | 
         | 
   126       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   127     };  | 
         | 
   128     class InEdgeIt {  | 
         | 
   129       friend class GraphWrapper<Graph>;  | 
         | 
   130       typename Graph::InEdgeIt e;  | 
         | 
   131     public:  | 
         | 
   132       InEdgeIt() { } | 
         | 
   133       InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { } | 
         | 
   134       InEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   135       InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) :   | 
         | 
   136 	e(*(_G.graph), typename Graph::Node(_n)) { } | 
         | 
   137       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   138     };  | 
         | 
   139     //typedef typename Graph::SymEdgeIt SymEdgeIt;  | 
         | 
   140     class EdgeIt {  | 
         | 
   141       friend class GraphWrapper<Graph>;  | 
         | 
   142       typename Graph::EdgeIt e;  | 
         | 
   143     public:  | 
         | 
   144       EdgeIt() { } | 
         | 
   145       EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { } | 
         | 
   146       EdgeIt(const Invalid& i) : e(i) { } | 
         | 
   147       EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { } | 
         | 
   148       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   149     };  | 
         | 
   150      | 
         | 
   151     NodeIt& first(NodeIt& i) const {  | 
         | 
   152       i=NodeIt(*this); return i;  | 
         | 
   153     }  | 
         | 
   154     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
   155       i=OutEdgeIt(*this, p); return i;  | 
         | 
   156     }  | 
         | 
   157     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
   158       i=InEdgeIt(*this, p); return i;  | 
         | 
   159     }  | 
         | 
   160     EdgeIt& first(EdgeIt& i) const {  | 
         | 
   161       i=EdgeIt(*this); return i;  | 
         | 
   162     }  | 
         | 
   163   | 
         | 
   164     NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; } | 
         | 
   165     OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; } | 
         | 
   166     InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; } | 
         | 
   167     EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }     | 
         | 
   168   | 
         | 
   169     Node tail(const Edge& e) const {  | 
         | 
   170       return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }  | 
         | 
   171     Node head(const Edge& e) const {  | 
         | 
   172       return Node(graph->head(static_cast<typename Graph::Edge>(e))); }  | 
         | 
   173   | 
         | 
   174     bool valid(const Node& n) const {  | 
         | 
   175       return graph->valid(static_cast<typename Graph::Node>(n)); }  | 
         | 
   176     bool valid(const Edge& e) const {  | 
         | 
   177       return graph->valid(static_cast<typename Graph::Edge>(e)); }  | 
         | 
   178   | 
         | 
   179     int nodeNum() const { return graph->nodeNum(); } | 
         | 
   180     int edgeNum() const { return graph->edgeNum(); } | 
         | 
   181     | 
         | 
   182     Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); } | 
         | 
   183     Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); } | 
         | 
   184     Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); } | 
         | 
   185     Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); } | 
         | 
   186     | 
         | 
   187     Node addNode() const { return Node(graph->addNode()); } | 
         | 
   188     Edge addEdge(const Node& tail, const Node& head) const {  | 
         | 
   189       return Edge(graph->addEdge(tail, head)); }  | 
         | 
   190   | 
         | 
   191     void erase(const Node& i) const { graph->erase(i); } | 
         | 
   192     void erase(const Edge& i) const { graph->erase(i); } | 
         | 
   193     | 
         | 
   194     void clear() const { graph->clear(); } | 
         | 
   195       | 
         | 
   196     template<typename T> class NodeMap : public Graph::template NodeMap<T> {  | 
         | 
   197       typedef typename Graph::template NodeMap<T> Parent;  | 
         | 
   198     public:  | 
         | 
   199       NodeMap(const GraphWrapper<Graph>& _G) :  Parent(*(_G.graph)) { } | 
         | 
   200       NodeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { } | 
         | 
   201     };  | 
         | 
   202   | 
         | 
   203     template<typename T> class EdgeMap : public Graph::template EdgeMap<T> {  | 
         | 
   204       typedef typename Graph::template EdgeMap<T> Parent;  | 
         | 
   205     public:  | 
         | 
   206       EdgeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { } | 
         | 
   207       EdgeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { } | 
         | 
   208     };  | 
         | 
   209   };  | 
         | 
   210   | 
         | 
   211   /// A graph wrapper which reverses the orientation of the edges.  | 
         | 
   212   | 
         | 
   213   /// A graph wrapper which reverses the orientation of the edges.  | 
         | 
   214   template<typename Graph>  | 
         | 
   215   class RevGraphWrapper : public GraphWrapper<Graph> { | 
         | 
   216   public:  | 
         | 
   217   | 
         | 
   218     RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }   | 
         | 
   219   | 
         | 
   220     typedef typename GraphWrapper<Graph>::Node Node;  | 
         | 
   221     typedef typename GraphWrapper<Graph>::Edge Edge;  | 
         | 
   222     //If Graph::OutEdgeIt is not defined  | 
         | 
   223     //and we do not want to use RevGraphWrapper::InEdgeIt,  | 
         | 
   224     //the typdef techinque does not work.  | 
         | 
   225     //Unfortunately all the typedefs are instantiated in templates.  | 
         | 
   226     //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;  | 
         | 
   227     //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;  | 
         | 
   228   | 
         | 
   229     class OutEdgeIt {  | 
         | 
   230       friend class GraphWrapper<Graph>;  | 
         | 
   231       friend class RevGraphWrapper<Graph>;  | 
         | 
   232       typename Graph::InEdgeIt e;  | 
         | 
   233     public:  | 
         | 
   234       OutEdgeIt() { } | 
         | 
   235       OutEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { } | 
         | 
   236       OutEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   237       OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :   | 
         | 
   238 	e(*(_G.graph), typename Graph::Node(_n)) { } | 
         | 
   239       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   240     };  | 
         | 
   241     class InEdgeIt {  | 
         | 
   242       friend class GraphWrapper<Graph>;  | 
         | 
   243       friend class RevGraphWrapper<Graph>;  | 
         | 
   244       typename Graph::OutEdgeIt e;  | 
         | 
   245     public:  | 
         | 
   246       InEdgeIt() { } | 
         | 
   247       InEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { } | 
         | 
   248       InEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   249       InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :   | 
         | 
   250 	e(*(_G.graph), typename Graph::Node(_n)) { } | 
         | 
   251       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   252     };  | 
         | 
   253   | 
         | 
   254     using GraphWrapper<Graph>::first;  | 
         | 
   255     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
   256       i=OutEdgeIt(*this, p); return i;  | 
         | 
   257     }  | 
         | 
   258     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
   259       i=InEdgeIt(*this, p); return i;  | 
         | 
   260     }  | 
         | 
   261   | 
         | 
   262     using GraphWrapper<Graph>::next;  | 
         | 
   263     OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; } | 
         | 
   264     InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; } | 
         | 
   265   | 
         | 
   266     Node aNode(const OutEdgeIt& e) const {  | 
         | 
   267       return Node(this->graph->aNode(e.e)); }  | 
         | 
   268     Node aNode(const InEdgeIt& e) const {  | 
         | 
   269       return Node(this->graph->aNode(e.e)); }  | 
         | 
   270     Node bNode(const OutEdgeIt& e) const {  | 
         | 
   271       return Node(this->graph->bNode(e.e)); }  | 
         | 
   272     Node bNode(const InEdgeIt& e) const {  | 
         | 
   273       return Node(this->graph->bNode(e.e)); }  | 
         | 
   274   | 
         | 
   275     Node tail(const Edge& e) const {  | 
         | 
   276       return GraphWrapper<Graph>::head(e); }  | 
         | 
   277     Node head(const Edge& e) const {  | 
         | 
   278       return GraphWrapper<Graph>::tail(e); }  | 
         | 
   279   | 
         | 
   280   };  | 
         | 
   281   | 
         | 
   282   /// Wrapper for hiding nodes and edges from a graph.  | 
         | 
   283     | 
         | 
   284   /// This wrapper shows a graph with filtered node-set and   | 
         | 
   285   /// edge-set. The quick brown fox iterator jumps over   | 
         | 
   286   /// the lazy dog nodes or edges if the values for them are false   | 
         | 
   287   /// in the bool maps.   | 
         | 
   288   template<typename Graph, typename NodeFilterMap,   | 
         | 
   289 	   typename EdgeFilterMap>  | 
         | 
   290   class SubGraphWrapper : public GraphWrapper<Graph> { | 
         | 
   291   protected:  | 
         | 
   292     NodeFilterMap* node_filter_map;  | 
         | 
   293     EdgeFilterMap* edge_filter_map;  | 
         | 
   294   public:  | 
         | 
   295   | 
         | 
   296     SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,   | 
         | 
   297 		    EdgeFilterMap& _edge_filter_map) :   | 
         | 
   298       GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),   | 
         | 
   299       edge_filter_map(&_edge_filter_map) { }   | 
         | 
   300   | 
         | 
   301     typedef typename GraphWrapper<Graph>::Node Node;  | 
         | 
   302     class NodeIt {  | 
         | 
   303       friend class GraphWrapper<Graph>;  | 
         | 
   304       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;  | 
         | 
   305       typename Graph::NodeIt n;  | 
         | 
   306      public:  | 
         | 
   307       NodeIt() { } | 
         | 
   308       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { } | 
         | 
   309       NodeIt(const Invalid& i) : n(i) { } | 
         | 
   310       NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :   | 
         | 
   311 	n(*(_G.graph)) {  | 
         | 
   312 	while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n])   | 
         | 
   313 	  _G.graph->next(n);  | 
         | 
   314       }  | 
         | 
   315       operator Node() const { return Node(typename Graph::Node(n)); } | 
         | 
   316     };  | 
         | 
   317     typedef typename GraphWrapper<Graph>::Edge Edge;  | 
         | 
   318     class OutEdgeIt {  | 
         | 
   319       friend class GraphWrapper<Graph>;  | 
         | 
   320       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;  | 
         | 
   321       typename Graph::OutEdgeIt e;  | 
         | 
   322     public:  | 
         | 
   323       OutEdgeIt() { } | 
         | 
   324       OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { } | 
         | 
   325       OutEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   326       OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,   | 
         | 
   327 		const Node& _n) :   | 
         | 
   328 	e(*(_G.graph), typename Graph::Node(_n)) {  | 
         | 
   329       	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])   | 
         | 
   330 	  _G.graph->next(e);  | 
         | 
   331       }  | 
         | 
   332       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   333     };  | 
         | 
   334     class InEdgeIt {  | 
         | 
   335       friend class GraphWrapper<Graph>;  | 
         | 
   336       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;  | 
         | 
   337       typename Graph::InEdgeIt e;  | 
         | 
   338     public:  | 
         | 
   339       InEdgeIt() { } | 
         | 
   340       InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { } | 
         | 
   341       InEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   342       InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,   | 
         | 
   343 	       const Node& _n) :   | 
         | 
   344 	e(*(_G.graph), typename Graph::Node(_n)) {  | 
         | 
   345       	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])   | 
         | 
   346 	  _G.graph->next(e);  | 
         | 
   347       }  | 
         | 
   348       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   349     };  | 
         | 
   350     //typedef typename Graph::SymEdgeIt SymEdgeIt;  | 
         | 
   351     class EdgeIt {  | 
         | 
   352       friend class GraphWrapper<Graph>;  | 
         | 
   353       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;  | 
         | 
   354       typename Graph::EdgeIt e;  | 
         | 
   355     public:  | 
         | 
   356       EdgeIt() { } | 
         | 
   357       EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { } | 
         | 
   358       EdgeIt(const Invalid& i) : e(i) { } | 
         | 
   359       EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :   | 
         | 
   360 	e(*(_G.graph)) {  | 
         | 
   361       	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e])   | 
         | 
   362 	  _G.graph->next(e);  | 
         | 
   363       }  | 
         | 
   364       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   365     };  | 
         | 
   366   | 
         | 
   367     NodeIt& first(NodeIt& i) const {  | 
         | 
   368       i=NodeIt(*this); return i;  | 
         | 
   369     }  | 
         | 
   370     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
   371       i=OutEdgeIt(*this, p); return i;  | 
         | 
   372     }  | 
         | 
   373     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
   374       i=InEdgeIt(*this, p); return i;  | 
         | 
   375     }  | 
         | 
   376     EdgeIt& first(EdgeIt& i) const {  | 
         | 
   377       i=EdgeIt(*this); return i;  | 
         | 
   378     }  | 
         | 
   379       | 
         | 
   380     NodeIt& next(NodeIt& i) const { | 
         | 
   381       this->graph->next(i.n);   | 
         | 
   382       while (this->graph->valid(i) && !(*node_filter_map)[i.n]) {  | 
         | 
   383 	this->graph->next(i.n); }  | 
         | 
   384       return i;  | 
         | 
   385     }  | 
         | 
   386     OutEdgeIt& next(OutEdgeIt& i) const { | 
         | 
   387       this->graph->next(i.e);   | 
         | 
   388       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {  | 
         | 
   389 	this->graph->next(i.e); }  | 
         | 
   390       return i;  | 
         | 
   391     }  | 
         | 
   392     InEdgeIt& next(InEdgeIt& i) const { | 
         | 
   393       this->graph->next(i.e);   | 
         | 
   394       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {  | 
         | 
   395 	this->graph->next(i.e); }  | 
         | 
   396       return i;  | 
         | 
   397     }  | 
         | 
   398     EdgeIt& next(EdgeIt& i) const { | 
         | 
   399       this->graph->next(i.e);   | 
         | 
   400       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) {  | 
         | 
   401 	this->graph->next(i.e); }  | 
         | 
   402       return i;  | 
         | 
   403     }  | 
         | 
   404   | 
         | 
   405     Node aNode(const OutEdgeIt& e) const {  | 
         | 
   406       return Node(this->graph->aNode(e.e)); }  | 
         | 
   407     Node aNode(const InEdgeIt& e) const {  | 
         | 
   408       return Node(this->graph->aNode(e.e)); }  | 
         | 
   409     Node bNode(const OutEdgeIt& e) const {  | 
         | 
   410       return Node(this->graph->bNode(e.e)); }  | 
         | 
   411     Node bNode(const InEdgeIt& e) const {  | 
         | 
   412       return Node(this->graph->bNode(e.e)); }  | 
         | 
   413   | 
         | 
   414     ///\todo  | 
         | 
   415     ///Some doki, please.  | 
         | 
   416     void hide(const Node& n) const { node_filter_map->set(n, false); } | 
         | 
   417     ///\todo  | 
         | 
   418     ///Some doki, please.  | 
         | 
   419     void hide(const Edge& e) const { edge_filter_map->set(e, false); } | 
         | 
   420   | 
         | 
   421     ///\todo  | 
         | 
   422     ///Some doki, please.  | 
         | 
   423     void unHide(const Node& n) const { node_filter_map->set(n, true); } | 
         | 
   424     ///\todo  | 
         | 
   425     ///Some doki, please.  | 
         | 
   426     void unHide(const Edge& e) const { edge_filter_map->set(e, true); } | 
         | 
   427   | 
         | 
   428     ///\todo  | 
         | 
   429     ///Some doki, please.  | 
         | 
   430     bool hidden(const Node& n) const { return (*node_filter_map)[n]; } | 
         | 
   431     ///\todo  | 
         | 
   432     ///Some doki, please.  | 
         | 
   433     bool hidden(const Edge& e) const { return (*edge_filter_map)[e]; } | 
         | 
   434   };  | 
         | 
   435   | 
         | 
   436   /// A wrapper for forgetting the orientation of a graph.  | 
         | 
   437   | 
         | 
   438   /// A wrapper for getting an undirected graph by forgetting  | 
         | 
   439   /// the orientation of a directed one.  | 
         | 
   440   template<typename Graph>  | 
         | 
   441   class UndirGraphWrapper : public GraphWrapper<Graph> { | 
         | 
   442   public:  | 
         | 
   443     typedef typename GraphWrapper<Graph>::Node Node;  | 
         | 
   444     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;  | 
         | 
   445     typedef typename GraphWrapper<Graph>::Edge Edge;  | 
         | 
   446     typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;  | 
         | 
   447   | 
         | 
   448     UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }   | 
         | 
   449   | 
         | 
   450     class OutEdgeIt { | 
         | 
   451       friend class UndirGraphWrapper<Graph>;  | 
         | 
   452       bool out_or_in; //true iff out  | 
         | 
   453       typename Graph::OutEdgeIt out;  | 
         | 
   454       typename Graph::InEdgeIt in;  | 
         | 
   455     public:  | 
         | 
   456       OutEdgeIt() { } | 
         | 
   457       OutEdgeIt(const Invalid& i) : Edge(i) { } | 
         | 
   458       OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) { | 
         | 
   459 	out_or_in=true; _G.graph->first(out, _n);  | 
         | 
   460 	if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n);	} | 
         | 
   461       }   | 
         | 
   462       operator Edge() const {  | 
         | 
   463 	if (out_or_in) return Edge(out); else return Edge(in);   | 
         | 
   464       }  | 
         | 
   465     };  | 
         | 
   466   | 
         | 
   467 //FIXME InEdgeIt  | 
         | 
   468     typedef OutEdgeIt InEdgeIt;   | 
         | 
   469   | 
         | 
   470     using GraphWrapper<Graph>::first;  | 
         | 
   471 //     NodeIt& first(NodeIt& i) const {  | 
         | 
   472 //       i=NodeIt(*this); return i;  | 
         | 
   473 //     }  | 
         | 
   474     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
   475       i=OutEdgeIt(*this, p); return i;  | 
         | 
   476     }  | 
         | 
   477 //FIXME  | 
         | 
   478 //     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
   479 //       i=InEdgeIt(*this, p); return i;  | 
         | 
   480 //     }  | 
         | 
   481 //     EdgeIt& first(EdgeIt& i) const {  | 
         | 
   482 //       i=EdgeIt(*this); return i;  | 
         | 
   483 //     }  | 
         | 
   484   | 
         | 
   485     using GraphWrapper<Graph>::next;  | 
         | 
   486 //     NodeIt& next(NodeIt& n) const { | 
         | 
   487 //       GraphWrapper<Graph>::next(n);  | 
         | 
   488 //       return n;  | 
         | 
   489 //     }  | 
         | 
   490     OutEdgeIt& next(OutEdgeIt& e) const { | 
         | 
   491       if (e.out_or_in) { | 
         | 
   492 	typename Graph::Node n=this->graph->tail(e.out);  | 
         | 
   493 	this->graph->next(e.out);  | 
         | 
   494 	if (!this->graph->valid(e.out)) {  | 
         | 
   495 	  e.out_or_in=false; this->graph->first(e.in, n); }  | 
         | 
   496       } else { | 
         | 
   497 	this->graph->next(e.in);  | 
         | 
   498       }  | 
         | 
   499       return e;  | 
         | 
   500     }  | 
         | 
   501     //FIXME InEdgeIt  | 
         | 
   502 //     EdgeIt& next(EdgeIt& e) const { | 
         | 
   503 //       GraphWrapper<Graph>::next(n);  | 
         | 
   504 // //      graph->next(e.e);  | 
         | 
   505 //       return e;  | 
         | 
   506 //     }  | 
         | 
   507   | 
         | 
   508     Node aNode(const OutEdgeIt& e) const {  | 
         | 
   509       if (e.out_or_in) return this->graph->tail(e); else   | 
         | 
   510 	return this->graph->head(e); }  | 
         | 
   511     Node bNode(const OutEdgeIt& e) const {  | 
         | 
   512       if (e.out_or_in) return this->graph->head(e); else   | 
         | 
   513 	return this->graph->tail(e); }  | 
         | 
   514   };  | 
         | 
   515     | 
         | 
   516   /// A wrapper for composing the residual graph for directed flow and circulation problems.  | 
         | 
   517   | 
         | 
   518   /// A wrapper for composing the residual graph for directed flow and circulation problems.  | 
         | 
   519   template<typename Graph, typename Number,   | 
         | 
   520 	   typename CapacityMap, typename FlowMap>  | 
         | 
   521   class ResGraphWrapper : public GraphWrapper<Graph> { | 
         | 
   522   protected:  | 
         | 
   523     const CapacityMap* capacity;  | 
         | 
   524     FlowMap* flow;  | 
         | 
   525   public:  | 
         | 
   526   | 
         | 
   527     ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity,   | 
         | 
   528 		    FlowMap& _flow) :   | 
         | 
   529       GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { } | 
         | 
   530   | 
         | 
   531     class Edge;   | 
         | 
   532     class OutEdgeIt;   | 
         | 
   533     friend class Edge;   | 
         | 
   534     friend class OutEdgeIt;   | 
         | 
   535   | 
         | 
   536     typedef typename GraphWrapper<Graph>::Node Node;  | 
         | 
   537     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;  | 
         | 
   538     class Edge : public Graph::Edge { | 
         | 
   539       friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;  | 
         | 
   540     protected:  | 
         | 
   541       bool forward; //true, iff forward  | 
         | 
   542 //      typename Graph::Edge e;  | 
         | 
   543     public:  | 
         | 
   544       Edge() { } | 
         | 
   545       Edge(const typename Graph::Edge& _e, bool _forward) :   | 
         | 
   546 	Graph::Edge(_e), forward(_forward) { } | 
         | 
   547       Edge(const Invalid& i) : Graph::Edge(i), forward(false) { } | 
         | 
   548 //the unique invalid iterator  | 
         | 
   549       friend bool operator==(const Edge& u, const Edge& v) {  | 
         | 
   550 	return (v.forward==u.forward &&   | 
         | 
   551 		static_cast<typename Graph::Edge>(u)==  | 
         | 
   552 		static_cast<typename Graph::Edge>(v));  | 
         | 
   553       }   | 
         | 
   554       friend bool operator!=(const Edge& u, const Edge& v) {  | 
         | 
   555 	return (v.forward!=u.forward ||   | 
         | 
   556 		static_cast<typename Graph::Edge>(u)!=  | 
         | 
   557 		static_cast<typename Graph::Edge>(v));  | 
         | 
   558       }   | 
         | 
   559     };  | 
         | 
   560   | 
         | 
   561     class OutEdgeIt { | 
         | 
   562       friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;  | 
         | 
   563     protected:  | 
         | 
   564       typename Graph::OutEdgeIt out;  | 
         | 
   565       typename Graph::InEdgeIt in;  | 
         | 
   566       bool forward;  | 
         | 
   567     public:  | 
         | 
   568       OutEdgeIt() { } | 
         | 
   569       //FIXME  | 
         | 
   570 //      OutEdgeIt(const Edge& e) : Edge(e) { } | 
         | 
   571       OutEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { } | 
         | 
   572 //the unique invalid iterator  | 
         | 
   573       OutEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {  | 
         | 
   574 	forward=true;  | 
         | 
   575 	resG.graph->first(out, v);  | 
         | 
   576 	while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); } | 
         | 
   577 	if (!resG.graph->valid(out)) { | 
         | 
   578 	  forward=false;  | 
         | 
   579 	  resG.graph->first(in, v);  | 
         | 
   580 	  while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); } | 
         | 
   581 	}  | 
         | 
   582       }  | 
         | 
   583       operator Edge() const {  | 
         | 
   584 //	Edge e;  | 
         | 
   585 //	e.forward=this->forward;  | 
         | 
   586 //	if (this->forward) e=out; else e=in;  | 
         | 
   587 //	return e;  | 
         | 
   588 	if (this->forward)   | 
         | 
   589 	  return Edge(out, this->forward);   | 
         | 
   590 	else   | 
         | 
   591 	  return Edge(in, this->forward);  | 
         | 
   592       }  | 
         | 
   593     };  | 
         | 
   594   | 
         | 
   595     class InEdgeIt { | 
         | 
   596       friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;  | 
         | 
   597     protected:  | 
         | 
   598       typename Graph::OutEdgeIt out;  | 
         | 
   599       typename Graph::InEdgeIt in;  | 
         | 
   600       bool forward;  | 
         | 
   601     public:  | 
         | 
   602       InEdgeIt() { } | 
         | 
   603       //FIXME  | 
         | 
   604 //      OutEdgeIt(const Edge& e) : Edge(e) { } | 
         | 
   605       InEdgeIt(const Invalid& i) : out(i), in(i), forward(false) { } | 
         | 
   606 //the unique invalid iterator  | 
         | 
   607       InEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG, Node v) {  | 
         | 
   608 	forward=true;  | 
         | 
   609 	resG.graph->first(in, v);  | 
         | 
   610 	while( resG.graph->valid(in) && !(resG.resCap(*this)>0) ) { resG.graph->next(in); } | 
         | 
   611 	if (!resG.graph->valid(in)) { | 
         | 
   612 	  forward=false;  | 
         | 
   613 	  resG.graph->first(out, v);  | 
         | 
   614 	  while( resG.graph->valid(out) && !(resG.resCap(*this)>0) ) { resG.graph->next(out); } | 
         | 
   615 	}  | 
         | 
   616       }  | 
         | 
   617       operator Edge() const {  | 
         | 
   618 //	Edge e;  | 
         | 
   619 //	e.forward=this->forward;  | 
         | 
   620 //	if (this->forward) e=out; else e=in;  | 
         | 
   621 //	return e;  | 
         | 
   622 	if (this->forward)   | 
         | 
   623 	  return Edge(in, this->forward);   | 
         | 
   624 	else   | 
         | 
   625 	  return Edge(out, this->forward);  | 
         | 
   626       }  | 
         | 
   627     };  | 
         | 
   628   | 
         | 
   629     class EdgeIt { | 
         | 
   630       friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;  | 
         | 
   631     protected:  | 
         | 
   632       typename Graph::EdgeIt e;  | 
         | 
   633       bool forward;  | 
         | 
   634     public:  | 
         | 
   635       EdgeIt() { } | 
         | 
   636       EdgeIt(const Invalid& i) : e(i), forward(false) { } | 
         | 
   637       EdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& resG) {  | 
         | 
   638 	forward=true;  | 
         | 
   639 	resG.graph->first(e);  | 
         | 
   640 	while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);  | 
         | 
   641 	if (!resG.graph->valid(e)) { | 
         | 
   642 	  forward=false;  | 
         | 
   643 	  resG.graph->first(e);  | 
         | 
   644 	  while (resG.graph->valid(e) && !(resG.resCap(*this)>0)) resG.graph->next(e);  | 
         | 
   645 	}  | 
         | 
   646       }  | 
         | 
   647       operator Edge() const {  | 
         | 
   648 	return Edge(e, this->forward);  | 
         | 
   649       }  | 
         | 
   650     };  | 
         | 
   651   | 
         | 
   652     using GraphWrapper<Graph>::first;  | 
         | 
   653 //     NodeIt& first(NodeIt& i) const {  | 
         | 
   654 //       i=NodeIt(*this); return i;  | 
         | 
   655 //     }  | 
         | 
   656     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
   657       i=OutEdgeIt(*this, p); return i;  | 
         | 
   658     }  | 
         | 
   659 //    FIXME not tested  | 
         | 
   660     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
   661       i=InEdgeIt(*this, p); return i;  | 
         | 
   662     }  | 
         | 
   663     EdgeIt& first(EdgeIt& i) const {  | 
         | 
   664       i=EdgeIt(*this); return i;  | 
         | 
   665     }  | 
         | 
   666     | 
         | 
   667     using GraphWrapper<Graph>::next;  | 
         | 
   668 //    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; } | 
         | 
   669     OutEdgeIt& next(OutEdgeIt& e) const {  | 
         | 
   670       if (e.forward) { | 
         | 
   671 	Node v=this->graph->aNode(e.out);  | 
         | 
   672 	this->graph->next(e.out);  | 
         | 
   673 	while( this->graph->valid(e.out) && !(resCap(e)>0) ) {  | 
         | 
   674 	  this->graph->next(e.out); }  | 
         | 
   675 	if (!this->graph->valid(e.out)) { | 
         | 
   676 	  e.forward=false;  | 
         | 
   677 	  this->graph->first(e.in, v);   | 
         | 
   678 	  while( this->graph->valid(e.in) && !(resCap(e)>0) ) {  | 
         | 
   679 	    this->graph->next(e.in); }  | 
         | 
   680 	}  | 
         | 
   681       } else { | 
         | 
   682 	this->graph->next(e.in);  | 
         | 
   683 	while( this->graph->valid(e.in) && !(resCap(e)>0) ) {  | 
         | 
   684 	  this->graph->next(e.in); }   | 
         | 
   685       }  | 
         | 
   686       return e;  | 
         | 
   687     }  | 
         | 
   688 //     FIXME Not tested  | 
         | 
   689     InEdgeIt& next(InEdgeIt& e) const {  | 
         | 
   690       if (e.forward) { | 
         | 
   691 	Node v=this->graph->aNode(e.in);  | 
         | 
   692 	this->graph->next(e.in);  | 
         | 
   693 	while( this->graph->valid(e.in) && !(resCap(e)>0) ) {  | 
         | 
   694 	  this->graph->next(e.in); }  | 
         | 
   695 	if (!this->graph->valid(e.in)) { | 
         | 
   696 	  e.forward=false;  | 
         | 
   697 	  this->graph->first(e.out, v);   | 
         | 
   698 	  while( this->graph->valid(e.out) && !(resCap(e)>0) ) {  | 
         | 
   699 	    this->graph->next(e.out); }  | 
         | 
   700 	}  | 
         | 
   701       } else { | 
         | 
   702 	this->graph->next(e.out);  | 
         | 
   703 	while( this->graph->valid(e.out) && !(resCap(e)>0) ) {  | 
         | 
   704 	  this->graph->next(e.out); }   | 
         | 
   705       }  | 
         | 
   706       return e;  | 
         | 
   707     }  | 
         | 
   708     EdgeIt& next(EdgeIt& e) const { | 
         | 
   709       if (e.forward) { | 
         | 
   710 	this->graph->next(e.e);  | 
         | 
   711 	while( this->graph->valid(e.e) && !(resCap(e)>0) ) {  | 
         | 
   712 	  this->graph->next(e.e); }  | 
         | 
   713 	if (!this->graph->valid(e.e)) { | 
         | 
   714 	  e.forward=false;  | 
         | 
   715 	  this->graph->first(e.e);   | 
         | 
   716 	  while( this->graph->valid(e.e) && !(resCap(e)>0) ) {  | 
         | 
   717 	    this->graph->next(e.e); }  | 
         | 
   718 	}  | 
         | 
   719       } else { | 
         | 
   720 	this->graph->next(e.e);  | 
         | 
   721 	while( this->graph->valid(e.e) && !(resCap(e)>0) ) {  | 
         | 
   722 	  this->graph->next(e.e); }   | 
         | 
   723       }  | 
         | 
   724       return e;  | 
         | 
   725     }  | 
         | 
   726   | 
         | 
   727     Node tail(Edge e) const {  | 
         | 
   728       return ((e.forward) ? this->graph->tail(e) : this->graph->head(e)); }  | 
         | 
   729     Node head(Edge e) const {  | 
         | 
   730       return ((e.forward) ? this->graph->head(e) : this->graph->tail(e)); }  | 
         | 
   731   | 
         | 
   732     Node aNode(OutEdgeIt e) const {  | 
         | 
   733       return ((e.forward) ? this->graph->aNode(e.out) :   | 
         | 
   734 	      this->graph->aNode(e.in)); }  | 
         | 
   735     Node bNode(OutEdgeIt e) const {  | 
         | 
   736       return ((e.forward) ? this->graph->bNode(e.out) :   | 
         | 
   737 	      this->graph->bNode(e.in)); }  | 
         | 
   738   | 
         | 
   739     Node aNode(InEdgeIt e) const {  | 
         | 
   740       return ((e.forward) ? this->graph->aNode(e.in) :   | 
         | 
   741 	      this->graph->aNode(e.out)); }  | 
         | 
   742     Node bNode(InEdgeIt e) const {  | 
         | 
   743       return ((e.forward) ? this->graph->bNode(e.in) :   | 
         | 
   744 	      this->graph->bNode(e.out)); }  | 
         | 
   745   | 
         | 
   746 //    int nodeNum() const { return graph->nodeNum(); } | 
         | 
   747     //FIXME  | 
         | 
   748     void edgeNum() const { } | 
         | 
   749     //int edgeNum() const { return graph->edgeNum(); } | 
         | 
   750   | 
         | 
   751   | 
         | 
   752 //    int id(Node v) const { return graph->id(v); } | 
         | 
   753   | 
         | 
   754     bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); } | 
         | 
   755     bool valid(Edge e) const {  | 
         | 
   756       return this->graph->valid(e);  | 
         | 
   757 	//return e.forward ? graph->valid(e.out) : graph->valid(e.in);   | 
         | 
   758     }  | 
         | 
   759   | 
         | 
   760     void augment(const Edge& e, Number a) const { | 
         | 
   761       if (e.forward)    | 
         | 
   762 // 	flow->set(e.out, flow->get(e.out)+a);  | 
         | 
   763 	flow->set(e, (*flow)[e]+a);  | 
         | 
   764       else    | 
         | 
   765 // 	flow->set(e.in, flow->get(e.in)-a);  | 
         | 
   766 	flow->set(e, (*flow)[e]-a);  | 
         | 
   767     }  | 
         | 
   768   | 
         | 
   769     Number resCap(const Edge& e) const {  | 
         | 
   770       if (e.forward)   | 
         | 
   771 //	return (capacity->get(e.out)-flow->get(e.out));   | 
         | 
   772 	return ((*capacity)[e]-(*flow)[e]);   | 
         | 
   773       else   | 
         | 
   774 //	return (flow->get(e.in));   | 
         | 
   775 	return ((*flow)[e]);   | 
         | 
   776     }  | 
         | 
   777   | 
         | 
   778 //     Number resCap(typename Graph::OutEdgeIt out) const {  | 
         | 
   779 // //      return (capacity->get(out)-flow->get(out));   | 
         | 
   780 //       return ((*capacity)[out]-(*flow)[out]);   | 
         | 
   781 //     }  | 
         | 
   782       | 
         | 
   783 //     Number resCap(typename Graph::InEdgeIt in) const {  | 
         | 
   784 // //      return (flow->get(in));   | 
         | 
   785 //       return ((*flow)[in]);   | 
         | 
   786 //     }  | 
         | 
   787   | 
         | 
   788     template <typename T>  | 
         | 
   789     class EdgeMap { | 
         | 
   790       typename Graph::template EdgeMap<T> forward_map, backward_map;   | 
         | 
   791     public:  | 
         | 
   792       EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { } | 
         | 
   793       EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { } | 
         | 
   794       void set(Edge e, T a) {  | 
         | 
   795 	if (e.forward)   | 
         | 
   796 	  forward_map.set(e.out, a);   | 
         | 
   797 	else   | 
         | 
   798 	  backward_map.set(e.in, a);   | 
         | 
   799       }  | 
         | 
   800       T operator[](Edge e) const {  | 
         | 
   801 	if (e.forward)   | 
         | 
   802 	  return forward_map[e.out];   | 
         | 
   803 	else   | 
         | 
   804 	  return backward_map[e.in];   | 
         | 
   805       }  | 
         | 
   806 //       T get(Edge e) const {  | 
         | 
   807 // 	if (e.out_or_in)   | 
         | 
   808 // 	  return forward_map.get(e.out);   | 
         | 
   809 // 	else   | 
         | 
   810 // 	  return backward_map.get(e.in);   | 
         | 
   811 //       }  | 
         | 
   812     };  | 
         | 
   813   };  | 
         | 
   814   | 
         | 
   815   /// ErasingFirstGraphWrapper for blocking flows.  | 
         | 
   816   | 
         | 
   817   /// ErasingFirstGraphWrapper for blocking flows.  | 
         | 
   818   template<typename Graph, typename FirstOutEdgesMap>  | 
         | 
   819   class ErasingFirstGraphWrapper : public GraphWrapper<Graph> { | 
         | 
   820   protected:  | 
         | 
   821     FirstOutEdgesMap* first_out_edges;  | 
         | 
   822   public:  | 
         | 
   823     ErasingFirstGraphWrapper(Graph& _graph,   | 
         | 
   824 			     FirstOutEdgesMap& _first_out_edges) :   | 
         | 
   825       GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }   | 
         | 
   826   | 
         | 
   827     typedef typename GraphWrapper<Graph>::Node Node;  | 
         | 
   828 //     class NodeIt {  | 
         | 
   829 //       friend class GraphWrapper<Graph>;  | 
         | 
   830 //       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;  | 
         | 
   831 //       typename Graph::NodeIt n;  | 
         | 
   832 //      public:  | 
         | 
   833 //       NodeIt() { } | 
         | 
   834 //       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { } | 
         | 
   835 //       NodeIt(const Invalid& i) : n(i) { } | 
         | 
   836 //       NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :   | 
         | 
   837 // 	n(*(_G.graph)) { } | 
         | 
   838 //       operator Node() const { return Node(typename Graph::Node(n)); } | 
         | 
   839 //     };  | 
         | 
   840     typedef typename GraphWrapper<Graph>::Edge Edge;  | 
         | 
   841     class OutEdgeIt {  | 
         | 
   842       friend class GraphWrapper<Graph>;  | 
         | 
   843       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;  | 
         | 
   844 //      typedef typename Graph::OutEdgeIt GraphOutEdgeIt;  | 
         | 
   845       typename Graph::OutEdgeIt e;  | 
         | 
   846     public:  | 
         | 
   847       OutEdgeIt() { } | 
         | 
   848       OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { } | 
         | 
   849       OutEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   850       OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,   | 
         | 
   851 		const Node& _n) :   | 
         | 
   852 	e((*_G.first_out_edges)[_n]) { } | 
         | 
   853       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   854     };  | 
         | 
   855     class InEdgeIt {  | 
         | 
   856       friend class GraphWrapper<Graph>;  | 
         | 
   857       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;  | 
         | 
   858 //      typedef typename Graph::InEdgeIt GraphInEdgeIt;  | 
         | 
   859       typename Graph::InEdgeIt e;  | 
         | 
   860     public:  | 
         | 
   861       InEdgeIt() { } | 
         | 
   862       InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { } | 
         | 
   863       InEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   864       InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,   | 
         | 
   865 	       const Node& _n) :   | 
         | 
   866 	e(*(_G.graph), typename Graph::Node(_n)) { } | 
         | 
   867       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   868     };  | 
         | 
   869     //typedef typename Graph::SymEdgeIt SymEdgeIt;  | 
         | 
   870     class EdgeIt {  | 
         | 
   871       friend class GraphWrapper<Graph>;  | 
         | 
   872       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;  | 
         | 
   873 //      typedef typename Graph::EdgeIt GraphEdgeIt;  | 
         | 
   874       typename Graph::EdgeIt e;  | 
         | 
   875     public:  | 
         | 
   876       EdgeIt() { } | 
         | 
   877       EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { } | 
         | 
   878       EdgeIt(const Invalid& i) : e(i) { } | 
         | 
   879       EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :   | 
         | 
   880 	e(*(_G.graph)) { } | 
         | 
   881       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
   882     };  | 
         | 
   883   | 
         | 
   884     using GraphWrapper<Graph>::first;  | 
         | 
   885 //     NodeIt& first(NodeIt& i) const {  | 
         | 
   886 //       i=NodeIt(*this); return i;  | 
         | 
   887 //     }  | 
         | 
   888     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
   889       i=OutEdgeIt(*this, p); return i;  | 
         | 
   890     }  | 
         | 
   891     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
   892       i=InEdgeIt(*this, p); return i;  | 
         | 
   893     }  | 
         | 
   894     EdgeIt& first(EdgeIt& i) const {  | 
         | 
   895       i=EdgeIt(*this); return i;  | 
         | 
   896     }  | 
         | 
   897   | 
         | 
   898     using GraphWrapper<Graph>::next;  | 
         | 
   899 //    NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; } | 
         | 
   900     OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; } | 
         | 
   901     InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; } | 
         | 
   902     EdgeIt& next(EdgeIt& i) const { this->graph->next(i.e); return i; }     | 
         | 
   903       | 
         | 
   904     Node aNode(const OutEdgeIt& e) const {  | 
         | 
   905       return Node(this->graph->aNode(e.e)); }  | 
         | 
   906     Node aNode(const InEdgeIt& e) const {  | 
         | 
   907       return Node(this->graph->aNode(e.e)); }  | 
         | 
   908     Node bNode(const OutEdgeIt& e) const {  | 
         | 
   909       return Node(this->graph->bNode(e.e)); }  | 
         | 
   910     Node bNode(const InEdgeIt& e) const {  | 
         | 
   911       return Node(this->graph->bNode(e.e)); }  | 
         | 
   912   | 
         | 
   913     void erase(const OutEdgeIt& e) const { | 
         | 
   914       OutEdgeIt f=e;  | 
         | 
   915       this->next(f);  | 
         | 
   916       first_out_edges->set(this->tail(e), f.e);  | 
         | 
   917     }  | 
         | 
   918   };  | 
         | 
   919   | 
         | 
   920   /// A wrapper for composing a bipartite graph.  | 
         | 
   921   /// \c _graph have to be a reference to a graph of type \c Graph   | 
         | 
   922   /// and \c _s_false_t_true_map is an \c IterableBoolMap   | 
         | 
   923   /// reference containing the elements for the   | 
         | 
   924   /// color classes S and T. \c _graph is to be referred to an undirected   | 
         | 
   925   /// graph or a directed graph with edges oriented from S to T.  | 
         | 
   926   template<typename Graph>   | 
         | 
   927   class BipartiteGraphWrapper : public GraphWrapper<Graph> { | 
         | 
   928     typedef IterableBoolMap< typename Graph::template NodeMap<int> >   | 
         | 
   929     SFalseTTrueMap;  | 
         | 
   930     SFalseTTrueMap* s_false_t_true_map;  | 
         | 
   931   | 
         | 
   932   public:  | 
         | 
   933     //marci  | 
         | 
   934     //FIXME vhogy igy kellene, csak az en forditom nem eszi meg  | 
         | 
   935     //static const bool S_CLASS=false;  | 
         | 
   936     //static const bool T_CLASS=true;  | 
         | 
   937       | 
         | 
   938     bool S_CLASS;  | 
         | 
   939     bool T_CLASS;  | 
         | 
   940   | 
         | 
   941     BipartiteGraphWrapper(Graph& _graph, SFalseTTrueMap& _s_false_t_true_map)   | 
         | 
   942       : GraphWrapper<Graph>(_graph), s_false_t_true_map(&_s_false_t_true_map),   | 
         | 
   943       S_CLASS(false), T_CLASS(true) { } | 
         | 
   944     typedef typename GraphWrapper<Graph>::Node Node;  | 
         | 
   945     //using GraphWrapper<Graph>::NodeIt;  | 
         | 
   946     typedef typename GraphWrapper<Graph>::Edge Edge;  | 
         | 
   947     //using GraphWrapper<Graph>::EdgeIt;  | 
         | 
   948     class ClassNodeIt;  | 
         | 
   949     friend class ClassNodeIt;  | 
         | 
   950     class OutEdgeIt;  | 
         | 
   951     friend class OutEdgeIt;  | 
         | 
   952     class InEdgeIt;  | 
         | 
   953     friend class InEdgeIt;  | 
         | 
   954     class ClassNodeIt { | 
         | 
   955       friend class BipartiteGraphWrapper<Graph>;  | 
         | 
   956     protected:  | 
         | 
   957       Node n;  | 
         | 
   958     public:  | 
         | 
   959       ClassNodeIt() { } | 
         | 
   960       ClassNodeIt(const Invalid& i) : n(i) { } | 
         | 
   961       ClassNodeIt(const BipartiteGraphWrapper<Graph>& _G, bool _class) {  | 
         | 
   962 	_G.s_false_t_true_map->first(n, _class);   | 
         | 
   963       }  | 
         | 
   964       //FIXME needed in new concept, important here  | 
         | 
   965       ClassNodeIt(const Node& _n) : n(_n) { } | 
         | 
   966       operator Node() const { return n; } | 
         | 
   967     };  | 
         | 
   968 //     class SNodeIt { | 
         | 
   969 //       Node n;  | 
         | 
   970 //     public:  | 
         | 
   971 //       SNodeIt() { } | 
         | 
   972 //       SNodeIt(const Invalid& i) : n(i) { } | 
         | 
   973 //       SNodeIt(const BipartiteGraphWrapper<Graph>& _G) {  | 
         | 
   974 // 	_G.s_false_t_true_map->first(n, false);   | 
         | 
   975 //       }  | 
         | 
   976 //       operator Node() const { return n; } | 
         | 
   977 //     };  | 
         | 
   978 //     class TNodeIt { | 
         | 
   979 //       Node n;  | 
         | 
   980 //     public:  | 
         | 
   981 //       TNodeIt() { } | 
         | 
   982 //       TNodeIt(const Invalid& i) : n(i) { } | 
         | 
   983 //       TNodeIt(const BipartiteGraphWrapper<Graph>& _G) {  | 
         | 
   984 // 	_G.s_false_t_true_map->first(n, true);   | 
         | 
   985 //       }  | 
         | 
   986 //       operator Node() const { return n; } | 
         | 
   987 //     };  | 
         | 
   988     class OutEdgeIt {  | 
         | 
   989       friend class BipartiteGraphWrapper<Graph>;  | 
         | 
   990     protected:  | 
         | 
   991       typename Graph::OutEdgeIt e;  | 
         | 
   992     public:  | 
         | 
   993       OutEdgeIt() { } | 
         | 
   994       OutEdgeIt(const Invalid& i) : e(i) { } | 
         | 
   995       OutEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) { | 
         | 
   996 	if (!(*(_G.s_false_t_true_map))[_n])   | 
         | 
   997 	  e=typename Graph::OutEdgeIt(*(_G.graph), typename Graph::Node(_n));  | 
         | 
   998 	else   | 
         | 
   999 	  e=INVALID;  | 
         | 
  1000       }  | 
         | 
  1001       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
  1002     };  | 
         | 
  1003     class InEdgeIt {  | 
         | 
  1004       friend class BipartiteGraphWrapper<Graph>;  | 
         | 
  1005     protected:  | 
         | 
  1006       typename Graph::InEdgeIt e;  | 
         | 
  1007     public:  | 
         | 
  1008       InEdgeIt() { } | 
         | 
  1009       InEdgeIt(const Invalid& i) : e(i) { } | 
         | 
  1010       InEdgeIt(const BipartiteGraphWrapper<Graph>& _G, const Node& _n) { | 
         | 
  1011 	if ((*(_G.s_false_t_true_map))[_n])   | 
         | 
  1012 	  e=typename Graph::InEdgeIt(*(_G.graph), typename Graph::Node(_n));  | 
         | 
  1013 	else   | 
         | 
  1014 	  e=INVALID;  | 
         | 
  1015       }  | 
         | 
  1016       operator Edge() const { return Edge(typename Graph::Edge(e)); } | 
         | 
  1017     };  | 
         | 
  1018   | 
         | 
  1019     using GraphWrapper<Graph>::first;  | 
         | 
  1020     ClassNodeIt& first(ClassNodeIt& n, bool _class) const {  | 
         | 
  1021       n=ClassNodeIt(*this, _class) ; return n; }  | 
         | 
  1022 //    SNodeIt& first(SNodeIt& n) const { n=SNodeIt(*this); return n; } | 
         | 
  1023 //    TNodeIt& first(TNodeIt& n) const { n=TNodeIt(*this); return n; } | 
         | 
  1024     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
  1025       i=OutEdgeIt(*this, p); return i;  | 
         | 
  1026     }  | 
         | 
  1027     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
  1028       i=InEdgeIt(*this, p); return i;  | 
         | 
  1029     }  | 
         | 
  1030   | 
         | 
  1031     using GraphWrapper<Graph>::next;  | 
         | 
  1032     ClassNodeIt& next(ClassNodeIt& n) const {  | 
         | 
  1033       this->s_false_t_true_map->next(n.n); return n;   | 
         | 
  1034     }  | 
         | 
  1035 //     SNodeIt& next(SNodeIt& n) const {  | 
         | 
  1036 //       this->s_false_t_true_map->next(n); return n;   | 
         | 
  1037 //     }  | 
         | 
  1038 //     TNodeIt& next(TNodeIt& n) const {  | 
         | 
  1039 //       this->s_false_t_true_map->next(n); return n;   | 
         | 
  1040 //     }  | 
         | 
  1041     OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; } | 
         | 
  1042     InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; } | 
         | 
  1043   | 
         | 
  1044     Node tail(const Edge& e) {  | 
         | 
  1045       if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])   | 
         | 
  1046 	return Node(this->graph->tail(e));  | 
         | 
  1047       else  | 
         | 
  1048 	return Node(this->graph->head(e));	  | 
         | 
  1049     }  | 
         | 
  1050     Node head(const Edge& e) {  | 
         | 
  1051       if (!(*(this->s_false_t_true_map))[this->graph->tail(e)])   | 
         | 
  1052 	return Node(this->graph->head(e));  | 
         | 
  1053       else  | 
         | 
  1054 	return Node(this->graph->tail(e));	  | 
         | 
  1055     }  | 
         | 
  1056   | 
         | 
  1057     Node aNode(const OutEdgeIt& e) const {  | 
         | 
  1058       return Node(this->graph->aNode(e.e));   | 
         | 
  1059     }  | 
         | 
  1060     Node aNode(const InEdgeIt& e) const {  | 
         | 
  1061       return Node(this->graph->aNode(e.e));   | 
         | 
  1062     }  | 
         | 
  1063     Node bNode(const OutEdgeIt& e) const {  | 
         | 
  1064       return Node(this->graph->bNode(e.e));   | 
         | 
  1065     }  | 
         | 
  1066     Node bNode(const InEdgeIt& e) const {  | 
         | 
  1067       return Node(this->graph->bNode(e.e));   | 
         | 
  1068     }  | 
         | 
  1069   | 
         | 
  1070     bool inSClass(const Node& n) const { | 
         | 
  1071       return !(*(this->s_false_t_true_map))[n];  | 
         | 
  1072     }  | 
         | 
  1073     bool inTClass(const Node& n) const { | 
         | 
  1074       return (*(this->s_false_t_true_map))[n];  | 
         | 
  1075     }  | 
         | 
  1076   };  | 
         | 
  1077   | 
         | 
  1078   | 
         | 
  1079   | 
         | 
  1080   | 
         | 
  1081   /********************   S-T Graph Wrapper    ********************/  | 
         | 
  1082   | 
         | 
  1083   | 
         | 
  1084   | 
         | 
  1085   | 
         | 
  1086   | 
         | 
  1087   template<typename Graph> class stGraphWrapper;  | 
         | 
  1088   | 
         | 
  1089   template<typename Graph>  | 
         | 
  1090   inline  | 
         | 
  1091   std::ostream&   | 
         | 
  1092   operator<<(std::ostream& os,  | 
         | 
  1093 	     typename stGraphWrapper<Graph>::Node const& i) {  | 
         | 
  1094     os << "(node: " << typename Graph::Node(i) << " spec: " << i.spec <<")";  | 
         | 
  1095     return os;   | 
         | 
  1096   }  | 
         | 
  1097   | 
         | 
  1098   template<typename Graph>  | 
         | 
  1099   inline  | 
         | 
  1100   std::ostream&   | 
         | 
  1101   operator<<(std::ostream& os,  | 
         | 
  1102 	     typename stGraphWrapper<Graph>::Edge const& i) {  | 
         | 
  1103     os << "(edge: " << typename Graph::Edge(i) << " spec: " << i.spec  | 
         | 
  1104        << " node: " << i.n << ")";   | 
         | 
  1105     return os;   | 
         | 
  1106   }  | 
         | 
  1107   | 
         | 
  1108   | 
         | 
  1109   /// experimentral, do not try it.  | 
         | 
  1110   /// It eats a bipartite graph, oriented from S to T.  | 
         | 
  1111   /// Such one can be made e.g. by the above wrapper.  | 
         | 
  1112   template<typename Graph>  | 
         | 
  1113   class stGraphWrapper : public GraphWrapper<Graph> { | 
         | 
  1114   public:  | 
         | 
  1115     class Node;   | 
         | 
  1116     friend class Node;  | 
         | 
  1117 //GN, int  | 
         | 
  1118 //0 normalis, 1 s, 2, true, ez az iteralasi sorrend,   | 
         | 
  1119 //es a vege a false azaz (invalid, 3)      | 
         | 
  1120     class NodeIt;  | 
         | 
  1121     friend class NodeIt;  | 
         | 
  1122 //GNI, int  | 
         | 
  1123     class Edge;  | 
         | 
  1124     friend class Edge;  | 
         | 
  1125 //GE, int, GN  | 
         | 
  1126 //0 normalis, 1 s->vmi, 2 vmi->t, ez a sorrend,  | 
         | 
  1127 //invalid: (invalid, 3, invalid)  | 
         | 
  1128     class OutEdgeIt;  | 
         | 
  1129     friend class OutEdgeIt;  | 
         | 
  1130 //GO, int, GNI  | 
         | 
  1131 //normalis pontbol (first, 0, invalid), ..., (invalid, 2, vmi), ... (invalid, 3, invalid)  | 
         | 
  1132 //s-bol (invalid, 1, first), ... (invalid, 3, invalid)  | 
         | 
  1133 //t-bol (invalid, 3, invalid)  | 
         | 
  1134     class InEdgeIt;  | 
         | 
  1135     friend class InEdgeIt;  | 
         | 
  1136 //GI, int, GNI  | 
         | 
  1137 //normalis pontbol (first, 0, invalid), ..., (invalid, 1, vmi), ... (invalid, 3, invalid)  | 
         | 
  1138 //s-be (invalid, 3, invalid)  | 
         | 
  1139 //t-be (invalid, 2, first), ... (invalid, 3, invalid)  | 
         | 
  1140     class EdgeIt;  | 
         | 
  1141     friend class EdgeIt;  | 
         | 
  1142 //(first, 0, invalid) ...  | 
         | 
  1143 //(invalid, 1, vmi)  | 
         | 
  1144 //(invalid, 2, vmi)  | 
         | 
  1145 //invalid, 3, invalid)  | 
         | 
  1146     template <typename T> class NodeMap;  | 
         | 
  1147     template <typename T, typename Parent> class EdgeMap;  | 
         | 
  1148   | 
         | 
  1149 //    template <typename T> friend class NodeMap;  | 
         | 
  1150 //    template <typename T> friend class EdgeMap;  | 
         | 
  1151   | 
         | 
  1152     const Node S_NODE;  | 
         | 
  1153     const Node T_NODE;  | 
         | 
  1154   | 
         | 
  1155     static const bool S_CLASS=false;  | 
         | 
  1156     static const bool T_CLASS=true;  | 
         | 
  1157   | 
         | 
  1158     stGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) ,   | 
         | 
  1159 				    S_NODE(INVALID, 1),   | 
         | 
  1160 				    T_NODE(INVALID, 2) { } | 
         | 
  1161   | 
         | 
  1162       | 
         | 
  1163     class Node : public Graph::Node { | 
         | 
  1164     protected:  | 
         | 
  1165       friend class GraphWrapper<Graph>;  | 
         | 
  1166       friend class stGraphWrapper<Graph>;  | 
         | 
  1167       template <typename T> friend class NodeMap;  | 
         | 
  1168       friend class Edge;  | 
         | 
  1169       friend class OutEdgeIt;  | 
         | 
  1170       friend class InEdgeIt;  | 
         | 
  1171       friend class EdgeIt;  | 
         | 
  1172       int spec;   | 
         | 
  1173     public:  | 
         | 
  1174       Node() { } | 
         | 
  1175       Node(const typename Graph::Node& _n, int _spec=0) :   | 
         | 
  1176 	Graph::Node(_n), spec(_spec) { } | 
         | 
  1177       Node(const Invalid& i) : Graph::Node(i), spec(3) { } | 
         | 
  1178       friend bool operator==(const Node& u, const Node& v) {  | 
         | 
  1179 	return (u.spec==v.spec &&   | 
         | 
  1180 		static_cast<typename Graph::Node>(u)==  | 
         | 
  1181 		static_cast<typename Graph::Node>(v));  | 
         | 
  1182       }   | 
         | 
  1183       friend bool operator!=(const Node& u, const Node& v) {  | 
         | 
  1184 	return (v.spec!=u.spec ||   | 
         | 
  1185 		static_cast<typename Graph::Node>(u)!=  | 
         | 
  1186 		static_cast<typename Graph::Node>(v));  | 
         | 
  1187       }  | 
         | 
  1188       friend std::ostream& operator<< <Graph>(std::ostream& os, const Node& i);  | 
         | 
  1189       int getSpec() const { return spec; } | 
         | 
  1190     };  | 
         | 
  1191   | 
         | 
  1192     class NodeIt {  | 
         | 
  1193       friend class GraphWrapper<Graph>;  | 
         | 
  1194       friend class stGraphWrapper<Graph>;  | 
         | 
  1195       typename Graph::NodeIt n;  | 
         | 
  1196       int spec;   | 
         | 
  1197      public:  | 
         | 
  1198       NodeIt() { } | 
         | 
  1199       NodeIt(const typename Graph::NodeIt& _n, int _spec) :   | 
         | 
  1200 	n(_n), spec(_spec) { } | 
         | 
  1201       NodeIt(const Invalid& i) : n(i), spec(3) { } | 
         | 
  1202       NodeIt(const stGraphWrapper<Graph>& _G) : n(*(_G.graph)), spec(0) {  | 
         | 
  1203 	if (!_G.graph->valid(n)) spec=1;  | 
         | 
  1204       }  | 
         | 
  1205       operator Node() const { return Node(n, spec); } | 
         | 
  1206     };  | 
         | 
  1207   | 
         | 
  1208     typedef NodeIt NodeIt;  | 
         | 
  1209     typedef Node Node;  | 
         | 
  1210   | 
         | 
  1211     class Edge : public Graph::Edge { | 
         | 
  1212       friend class GraphWrapper<Graph>;  | 
         | 
  1213       friend class stGraphWrapper<Graph>;  | 
         | 
  1214       template <typename T, typename Parent> friend class EdgeMap;  | 
         | 
  1215       int spec;  | 
         | 
  1216       typename Graph::Node n;  | 
         | 
  1217     public:  | 
         | 
  1218       Edge() { } | 
         | 
  1219       Edge(const typename Graph::Edge& _e, int _spec,   | 
         | 
  1220 	   const typename Graph::Node& _n) :   | 
         | 
  1221 	Graph::Edge(_e), spec(_spec), n(_n) {  | 
         | 
  1222       }  | 
         | 
  1223       Edge(const Invalid& i) : Graph::Edge(i), spec(3), n(i) { } | 
         | 
  1224       friend bool operator==(const Edge& u, const Edge& v) {  | 
         | 
  1225 	return (u.spec==v.spec &&   | 
         | 
  1226 		static_cast<typename Graph::Edge>(u)==  | 
         | 
  1227 		static_cast<typename Graph::Edge>(v) &&   | 
         | 
  1228 		u.n==v.n);  | 
         | 
  1229       }   | 
         | 
  1230       friend bool operator!=(const Edge& u, const Edge& v) {  | 
         | 
  1231 	return (v.spec!=u.spec ||   | 
         | 
  1232 		static_cast<typename Graph::Edge>(u)!=  | 
         | 
  1233 		static_cast<typename Graph::Edge>(v) ||   | 
         | 
  1234 		u.n!=v.n);  | 
         | 
  1235       }   | 
         | 
  1236       friend std::ostream& operator<< <Graph>(std::ostream& os, const Edge& i);  | 
         | 
  1237       int getSpec() const { return spec; } | 
         | 
  1238     };  | 
         | 
  1239   | 
         | 
  1240     class OutEdgeIt {  | 
         | 
  1241       friend class GraphWrapper<Graph>;  | 
         | 
  1242       friend class stGraphWrapper<Graph>;  | 
         | 
  1243       typename Graph::OutEdgeIt e;  | 
         | 
  1244       int spec;  | 
         | 
  1245       typename Graph::ClassNodeIt n;  | 
         | 
  1246     public:  | 
         | 
  1247       OutEdgeIt() { } | 
         | 
  1248       OutEdgeIt(const typename Graph::OutEdgeIt& _e, int _spec,   | 
         | 
  1249 		const typename Graph::ClassNodeIt& _n) :   | 
         | 
  1250 	e(_e), spec(_spec), n(_n) {  | 
         | 
  1251       }  | 
         | 
  1252       OutEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { } | 
         | 
  1253       OutEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) { | 
         | 
  1254 	switch (_n.spec) { | 
         | 
  1255 	  case 0 :   | 
         | 
  1256 	    if (_G.graph->inSClass(_n)) { //S, van normalis kiel  | 
         | 
  1257 	      e=typename Graph::OutEdgeIt(*(_G.graph),   | 
         | 
  1258 					  typename Graph::Node(_n));   | 
         | 
  1259 	      spec=0;  | 
         | 
  1260 	      n=INVALID;  | 
         | 
  1261 	      if (!_G.graph->valid(e)) spec=3;  | 
         | 
  1262 	    } else { //T, specko kiel van | 
         | 
  1263 	      e=INVALID;  | 
         | 
  1264 	      spec=2;  | 
         | 
  1265 	      n=_n;  | 
         | 
  1266 	    }  | 
         | 
  1267 	    break;  | 
         | 
  1268 	  case 1:  | 
         | 
  1269 	    e=INVALID;  | 
         | 
  1270 	    spec=1;  | 
         | 
  1271 	    _G.graph->first(n, S_CLASS); //s->vmi;  | 
         | 
  1272 	    if (!_G.graph->valid(n)) spec=3; //Ha S ures  | 
         | 
  1273 	    break;  | 
         | 
  1274 	  case 2:  | 
         | 
  1275 	    e=INVALID;  | 
         | 
  1276 	    spec=3;  | 
         | 
  1277 	    n=INVALID;  | 
         | 
  1278 	    break;  | 
         | 
  1279 	}  | 
         | 
  1280       }  | 
         | 
  1281       operator Edge() const { return Edge(e, spec, n); } | 
         | 
  1282     };  | 
         | 
  1283   | 
         | 
  1284     class InEdgeIt {  | 
         | 
  1285       friend class GraphWrapper<Graph>;  | 
         | 
  1286       friend class stGraphWrapper<Graph>;  | 
         | 
  1287       typename Graph::InEdgeIt e;  | 
         | 
  1288       int spec;  | 
         | 
  1289       typename Graph::ClassNodeIt n;  | 
         | 
  1290     public:  | 
         | 
  1291       InEdgeIt() { } | 
         | 
  1292       InEdgeIt(const typename Graph::InEdgeIt& _e, int _spec,   | 
         | 
  1293 	       const typename Graph::ClassNodeIt& _n) :   | 
         | 
  1294 	e(_e), spec(_spec), n(_n) {  | 
         | 
  1295       }  | 
         | 
  1296       InEdgeIt(const Invalid& i) : e(i), spec(3), n(i) { } | 
         | 
  1297       InEdgeIt(const stGraphWrapper<Graph>& _G, const Node& _n) { | 
         | 
  1298 	switch (_n.spec) { | 
         | 
  1299 	  case 0 :   | 
         | 
  1300 	    if (_G.graph->inTClass(_n)) { //T, van normalis beel  | 
         | 
  1301 	      e=typename Graph::InEdgeIt(*(_G.graph),   | 
         | 
  1302 					 typename Graph::Node(_n));   | 
         | 
  1303 	      spec=0;  | 
         | 
  1304 	      n=INVALID;  | 
         | 
  1305 	      if (!_G.graph->valid(e)) spec=3;  | 
         | 
  1306 	    } else { //S, specko beel van | 
         | 
  1307 	      e=INVALID;  | 
         | 
  1308 	      spec=1;  | 
         | 
  1309 	      n=_n;  | 
         | 
  1310 	    }  | 
         | 
  1311 	    break;  | 
         | 
  1312 	  case 1:  | 
         | 
  1313 	    e=INVALID;  | 
         | 
  1314 	    spec=3;  | 
         | 
  1315 	    n=INVALID;  | 
         | 
  1316 	    break;  | 
         | 
  1317 	  case 2:  | 
         | 
  1318 	    e=INVALID;  | 
         | 
  1319 	    spec=2;  | 
         | 
  1320 	    _G.graph->first(n, T_CLASS); //vmi->t;  | 
         | 
  1321 	    if (!_G.graph->valid(n)) spec=3; //Ha T ures  | 
         | 
  1322 	    break;  | 
         | 
  1323 	}  | 
         | 
  1324       }  | 
         | 
  1325       operator Edge() const { return Edge(e, spec, n); } | 
         | 
  1326     };  | 
         | 
  1327   | 
         | 
  1328     class EdgeIt {  | 
         | 
  1329       friend class GraphWrapper<Graph>;  | 
         | 
  1330       friend class stGraphWrapper<Graph>;  | 
         | 
  1331       typename Graph::EdgeIt e;  | 
         | 
  1332       int spec;  | 
         | 
  1333       typename Graph::ClassNodeIt n;  | 
         | 
  1334     public:  | 
         | 
  1335       EdgeIt() { } | 
         | 
  1336       EdgeIt(const typename Graph::EdgeIt& _e, int _spec,   | 
         | 
  1337 	     const typename Graph::ClassNodeIt& _n) :   | 
         | 
  1338 	e(_e), spec(_spec), n(_n) { } | 
         | 
  1339       EdgeIt(const Invalid& i) : e(i), spec(3), n(i) { } | 
         | 
  1340       EdgeIt(const stGraphWrapper<Graph>& _G) :   | 
         | 
  1341 	e(*(_G.graph)), spec(0), n(INVALID) {  | 
         | 
  1342 	if (!_G.graph->valid(e)) { | 
         | 
  1343 	  spec=1;  | 
         | 
  1344 	  _G.graph->first(n, S_CLASS);  | 
         | 
  1345 	  if (!_G.graph->valid(n)) { //Ha S ures | 
         | 
  1346 	    spec=2;  | 
         | 
  1347 	    _G.graph->first(n, T_CLASS);  | 
         | 
  1348 	    if (!_G.graph->valid(n)) { //Ha T ures | 
         | 
  1349 	      spec=3;  | 
         | 
  1350 	    }  | 
         | 
  1351 	  }  | 
         | 
  1352 	}  | 
         | 
  1353       }  | 
         | 
  1354       operator Edge() const { return Edge(e, spec, n); } | 
         | 
  1355     };  | 
         | 
  1356      | 
         | 
  1357     NodeIt& first(NodeIt& i) const {  | 
         | 
  1358       i=NodeIt(*this); return i;  | 
         | 
  1359     }  | 
         | 
  1360     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
         | 
  1361       i=OutEdgeIt(*this, p); return i;  | 
         | 
  1362     }  | 
         | 
  1363     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
         | 
  1364       i=InEdgeIt(*this, p); return i;  | 
         | 
  1365     }  | 
         | 
  1366     EdgeIt& first(EdgeIt& i) const {  | 
         | 
  1367       i=EdgeIt(*this); return i;  | 
         | 
  1368     }  | 
         | 
  1369   | 
         | 
  1370     NodeIt& next(NodeIt& i) const {  | 
         | 
  1371       switch (i.spec) { | 
         | 
  1372 	case 0:  | 
         | 
  1373 	  this->graph->next(i.n);  | 
         | 
  1374 	  if (!this->graph->valid(i.n)) { | 
         | 
  1375 	    i.spec=1;  | 
         | 
  1376 	  }  | 
         | 
  1377 	  break;  | 
         | 
  1378 	case 1:  | 
         | 
  1379 	  i.spec=2;  | 
         | 
  1380 	  break;  | 
         | 
  1381 	case 2:  | 
         | 
  1382 	  i.spec=3;  | 
         | 
  1383 	  break;  | 
         | 
  1384       }  | 
         | 
  1385       return i;   | 
         | 
  1386     }  | 
         | 
  1387     OutEdgeIt& next(OutEdgeIt& i) const {  | 
         | 
  1388       typename Graph::Node v;  | 
         | 
  1389       switch (i.spec) { | 
         | 
  1390 	case 0: //normal edge  | 
         | 
  1391 	  v=this->graph->aNode(i.e);  | 
         | 
  1392 	  this->graph->next(i.e);  | 
         | 
  1393 	  if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk | 
         | 
  1394 	    if (this->graph->inSClass(v)) { //S, nincs kiel | 
         | 
  1395 	      i.spec=3;  | 
         | 
  1396 	      i.n=INVALID;  | 
         | 
  1397 	    } else { //T, van kiel | 
         | 
  1398 	      i.spec=2;   | 
         | 
  1399 	      i.n=v;  | 
         | 
  1400 	    }  | 
         | 
  1401 	  }  | 
         | 
  1402 	  break;  | 
         | 
  1403 	case 1: //s->vmi  | 
         | 
  1404 	  this->graph->next(i.n);  | 
         | 
  1405 	  if (!this->graph->valid(i.n)) i.spec=3;  | 
         | 
  1406 	  break;  | 
         | 
  1407 	case 2: //vmi->t  | 
         | 
  1408 	  i.spec=3;  | 
         | 
  1409 	  i.n=INVALID;  | 
         | 
  1410 	  break;  | 
         | 
  1411       }  | 
         | 
  1412       return i;   | 
         | 
  1413     }  | 
         | 
  1414     InEdgeIt& next(InEdgeIt& i) const {  | 
         | 
  1415       typename Graph::Node v;  | 
         | 
  1416       switch (i.spec) { | 
         | 
  1417 	case 0: //normal edge  | 
         | 
  1418 	  v=this->graph->aNode(i.e);  | 
         | 
  1419 	  this->graph->next(i.e);  | 
         | 
  1420 	  if (!this->graph->valid(i.e)) { //Az igazi elek vegere ertunk | 
         | 
  1421 	    if (this->graph->inTClass(v)) { //S, nincs beel | 
         | 
  1422 	      i.spec=3;  | 
         | 
  1423 	      i.n=INVALID;  | 
         | 
  1424 	    } else { //S, van beel | 
         | 
  1425 	      i.spec=1;   | 
         | 
  1426 	      i.n=v;  | 
         | 
  1427 	    }  | 
         | 
  1428 	  }  | 
         | 
  1429 	  break;  | 
         | 
  1430 	case 1: //s->vmi  | 
         | 
  1431 	  i.spec=3;  | 
         | 
  1432 	  i.n=INVALID;  | 
         | 
  1433 	  break;  | 
         | 
  1434 	case 2: //vmi->t  | 
         | 
  1435 	  this->graph->next(i.n);  | 
         | 
  1436 	  if (!this->graph->valid(i.n)) i.spec=3;  | 
         | 
  1437 	  break;  | 
         | 
  1438       }  | 
         | 
  1439       return i;   | 
         | 
  1440     }  | 
         | 
  1441   | 
         | 
  1442     EdgeIt& next(EdgeIt& i) const {  | 
         | 
  1443       switch (i.spec) { | 
         | 
  1444 	case 0:  | 
         | 
  1445 	  this->graph->next(i.e);  | 
         | 
  1446 	  if (!this->graph->valid(i.e)) {  | 
         | 
  1447 	    i.spec=1;  | 
         | 
  1448 	    this->graph->first(i.n, S_CLASS);  | 
         | 
  1449 	    if (!this->graph->valid(i.n)) { | 
         | 
  1450 	      i.spec=2;  | 
         | 
  1451 	      this->graph->first(i.n, T_CLASS);  | 
         | 
  1452 	      if (!this->graph->valid(i.n)) i.spec=3;  | 
         | 
  1453 	    }  | 
         | 
  1454 	  }  | 
         | 
  1455 	  break;  | 
         | 
  1456 	case 1:  | 
         | 
  1457 	  this->graph->next(i.n);  | 
         | 
  1458 	  if (!this->graph->valid(i.n)) { | 
         | 
  1459 	    i.spec=2;  | 
         | 
  1460 	    this->graph->first(i.n, T_CLASS);  | 
         | 
  1461 	    if (!this->graph->valid(i.n)) i.spec=3;  | 
         | 
  1462 	  }  | 
         | 
  1463 	  break;  | 
         | 
  1464 	case 2:  | 
         | 
  1465 	  this->graph->next(i.n);  | 
         | 
  1466 	  if (!this->graph->valid(i.n)) i.spec=3;  | 
         | 
  1467 	  break;  | 
         | 
  1468       }  | 
         | 
  1469       return i;   | 
         | 
  1470     }      | 
         | 
  1471   | 
         | 
  1472     Node tail(const Edge& e) const {  | 
         | 
  1473       switch (e.spec) { | 
         | 
  1474       case 0:   | 
         | 
  1475 	return Node(this->graph->tail(e));  | 
         | 
  1476 	break;  | 
         | 
  1477       case 1:  | 
         | 
  1478 	return S_NODE;  | 
         | 
  1479 	break;  | 
         | 
  1480       case 2:  | 
         | 
  1481       default:  | 
         | 
  1482 	return Node(e.n);  | 
         | 
  1483 	break;  | 
         | 
  1484       }  | 
         | 
  1485     }  | 
         | 
  1486     Node head(const Edge& e) const {  | 
         | 
  1487       switch (e.spec) { | 
         | 
  1488       case 0:   | 
         | 
  1489 	return Node(this->graph->head(e));  | 
         | 
  1490 	break;  | 
         | 
  1491       case 1:  | 
         | 
  1492 	return Node(e.n);  | 
         | 
  1493 	break;  | 
         | 
  1494       case 2:  | 
         | 
  1495       default:  | 
         | 
  1496 	return T_NODE;  | 
         | 
  1497 	break;  | 
         | 
  1498       }  | 
         | 
  1499     }  | 
         | 
  1500   | 
         | 
  1501     bool valid(const Node& n) const { return (n.spec<3); } | 
         | 
  1502     bool valid(const Edge& e) const { return (e.spec<3); } | 
         | 
  1503   | 
         | 
  1504     int nodeNum() const { return this->graph->nodeNum()+2; } | 
         | 
  1505     int edgeNum() const {  | 
         | 
  1506       return this->graph->edgeNum()+this->graph->nodeNum();   | 
         | 
  1507     }  | 
         | 
  1508     | 
         | 
  1509     Node aNode(const OutEdgeIt& e) const { return tail(e); } | 
         | 
  1510     Node aNode(const InEdgeIt& e) const { return head(e); } | 
         | 
  1511     Node bNode(const OutEdgeIt& e) const { return head(e); } | 
         | 
  1512     Node bNode(const InEdgeIt& e) const { return tail(e); } | 
         | 
  1513   | 
         | 
  1514     void addNode() const { } | 
         | 
  1515     void addEdge() const { } | 
         | 
  1516       | 
         | 
  1517 //    Node addNode() const { return Node(this->graph->addNode()); } | 
         | 
  1518 //    Edge addEdge(const Node& tail, const Node& head) const {  | 
         | 
  1519 //      return Edge(this->graph->addEdge(tail, head)); }  | 
         | 
  1520   | 
         | 
  1521 //    void erase(const Node& i) const { this->graph->erase(i); } | 
         | 
  1522 //    void erase(const Edge& i) const { this->graph->erase(i); } | 
         | 
  1523     | 
         | 
  1524 //    void clear() const { this->graph->clear(); } | 
         | 
  1525       | 
         | 
  1526     template<typename T> class NodeMap : public GraphWrapper<Graph>::template NodeMap<T> {  | 
         | 
  1527       typedef typename GraphWrapper<Graph>::template NodeMap<T> Parent;  | 
         | 
  1528       T s_value, t_value;  | 
         | 
  1529     public:  | 
         | 
  1530       NodeMap(const stGraphWrapper<Graph>& _G) :  Parent(_G),   | 
         | 
  1531 						  s_value(),   | 
         | 
  1532 						  t_value() { } | 
         | 
  1533       NodeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),   | 
         | 
  1534 						      s_value(a),   | 
         | 
  1535 						      t_value(a) { } | 
         | 
  1536       T operator[](const Node& n) const {  | 
         | 
  1537 	switch (n.spec) { | 
         | 
  1538 	case 0:   | 
         | 
  1539 	  return Parent::operator[](n);  | 
         | 
  1540 	  break;  | 
         | 
  1541 	case 1:  | 
         | 
  1542 	  return s_value;  | 
         | 
  1543 	  break;  | 
         | 
  1544 	case 2:   | 
         | 
  1545 	default:  | 
         | 
  1546 	  return t_value;  | 
         | 
  1547 	  break;  | 
         | 
  1548 	}  | 
         | 
  1549       }  | 
         | 
  1550       void set(const Node& n, T t) {  | 
         | 
  1551 	switch (n.spec) { | 
         | 
  1552 	case 0:   | 
         | 
  1553 	  GraphWrapper<Graph>::template NodeMap<T>::set(n, t);  | 
         | 
  1554 	  break;  | 
         | 
  1555 	case 1:  | 
         | 
  1556 	  s_value=t;  | 
         | 
  1557 	  break;  | 
         | 
  1558 	case 2:  | 
         | 
  1559 	default:  | 
         | 
  1560 	  t_value=t;  | 
         | 
  1561 	  break;  | 
         | 
  1562 	}  | 
         | 
  1563       }  | 
         | 
  1564     };  | 
         | 
  1565   | 
         | 
  1566     template<typename T,   | 
         | 
  1567 	     typename Parent=  | 
         | 
  1568 	     typename GraphWrapper<Graph>::template EdgeMap<T> >   | 
         | 
  1569     class EdgeMap : public Parent {  | 
         | 
  1570       //typedef typename GraphWrapper<Graph>::template EdgeMap<T> Parent;  | 
         | 
  1571       typename GraphWrapper<Graph>::template NodeMap<T> node_value;  | 
         | 
  1572     public:  | 
         | 
  1573       EdgeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),   | 
         | 
  1574 						 node_value(_G) { } | 
         | 
  1575       EdgeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),   | 
         | 
  1576 						      node_value(_G, a) { } | 
         | 
  1577       T operator[](const Edge& e) const {  | 
         | 
  1578 	switch (e.spec) { | 
         | 
  1579 	case 0:   | 
         | 
  1580 	  return Parent::operator[](e);  | 
         | 
  1581 	  break;  | 
         | 
  1582 	case 1:  | 
         | 
  1583 	  return node_value[e.n];  | 
         | 
  1584 	  break;  | 
         | 
  1585 	case 2:  | 
         | 
  1586 	default:  | 
         | 
  1587 	  return node_value[e.n];  | 
         | 
  1588 	  break;  | 
         | 
  1589 	}  | 
         | 
  1590       }  | 
         | 
  1591       void set(const Edge& e, T t) {  | 
         | 
  1592 	switch (e.spec) { | 
         | 
  1593 	case 0:   | 
         | 
  1594 	  Parent::set(e, t);  | 
         | 
  1595 	  break;  | 
         | 
  1596 	case 1:  | 
         | 
  1597 	  node_value.set(e.n, t);  | 
         | 
  1598 	  break;  | 
         | 
  1599 	case 2:  | 
         | 
  1600 	default:  | 
         | 
  1601 	  node_value.set(e.n, t);  | 
         | 
  1602 	  break;  | 
         | 
  1603 	}  | 
         | 
  1604       }  | 
         | 
  1605     };  | 
         | 
  1606   | 
         | 
  1607 //     template<typename T> class EdgeMap : public GraphWrapper<Graph>::template EdgeMap<T> {  | 
         | 
  1608 //       typedef typename GraphWrapper<Graph>::template EdgeMap<T> Parent;  | 
         | 
  1609 //       typename GraphWrapper<Graph>::template NodeMap<T> node_value;  | 
         | 
  1610 //     public:  | 
         | 
  1611 //       EdgeMap(const stGraphWrapper<Graph>& _G) : Parent(_G),   | 
         | 
  1612 // 						 node_value(_G) { } | 
         | 
  1613 //       EdgeMap(const stGraphWrapper<Graph>& _G, T a) : Parent(_G, a),   | 
         | 
  1614 // 						      node_value(_G, a) { } | 
         | 
  1615 //       T operator[](const Edge& e) const {  | 
         | 
  1616 // 	switch (e.spec) { | 
         | 
  1617 // 	case 0:   | 
         | 
  1618 // 	  return Parent::operator[](e);  | 
         | 
  1619 // 	  break;  | 
         | 
  1620 // 	case 1:  | 
         | 
  1621 // 	  return node_value[e.n];  | 
         | 
  1622 // 	  break;  | 
         | 
  1623 // 	case 2:  | 
         | 
  1624 // 	default:  | 
         | 
  1625 // 	  return node_value[e.n];  | 
         | 
  1626 // 	  break;  | 
         | 
  1627 // 	}  | 
         | 
  1628 //       }  | 
         | 
  1629 //       void set(const Edge& e, T t) {  | 
         | 
  1630 // 	switch (e.spec) { | 
         | 
  1631 // 	case 0:   | 
         | 
  1632 // 	  GraphWrapper<Graph>::template EdgeMap<T>::set(e, t);  | 
         | 
  1633 // 	  break;  | 
         | 
  1634 // 	case 1:  | 
         | 
  1635 // 	  node_value.set(e.n, t);  | 
         | 
  1636 // 	  break;  | 
         | 
  1637 // 	case 2:  | 
         | 
  1638 // 	default:  | 
         | 
  1639 // 	  node_value.set(e.n, t);  | 
         | 
  1640 // 	  break;  | 
         | 
  1641 // 	}  | 
         | 
  1642 //       }  | 
         | 
  1643 //     };  | 
         | 
  1644   | 
         | 
  1645   };  | 
         | 
  1646   | 
         | 
  1647   ///@}  | 
         | 
  1648   | 
         | 
  1649 } //namespace hugo  | 
         | 
  1650   | 
         | 
  1651   | 
         | 
  1652 #endif //HUGO_GRAPH_WRAPPER_H  | 
         | 
  1653   |