2 #ifndef HUGO_GRAPH_WRAPPER_H
 
     3 #define HUGO_GRAPH_WRAPPER_H
 
     9   template<typename Graph>
 
    10   class TrivGraphWrapper {
 
    15     typedef Graph BaseGraph;
 
    17 //     TrivGraphWrapper() : graph(0) { }
 
    18     TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
 
    19 //     void setGraph(Graph& _graph) { graph = &_graph; }
 
    20 //     Graph& getGraph() const { return *graph; }
 
    22     typedef typename Graph::Node Node;
 
    23     class NodeIt : public Graph::NodeIt { 
 
    26       NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
 
    27       NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
 
    28       NodeIt(const TrivGraphWrapper<Graph>& _G) : 
 
    29 	Graph::NodeIt(*(_G.graph)) { }
 
    31     typedef typename Graph::Edge Edge;
 
    32     class OutEdgeIt : public Graph::OutEdgeIt { 
 
    35       OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
 
    36       OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
 
    37       OutEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) : 
 
    38 	Graph::OutEdgeIt(*(_G.graph), n) { }
 
    40     class InEdgeIt : public Graph::InEdgeIt { 
 
    43       InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
 
    44       InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
 
    45       InEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) : 
 
    46 	Graph::InEdgeIt(*(_G.graph), n) { }
 
    48     //typedef typename Graph::SymEdgeIt SymEdgeIt;
 
    49     class EdgeIt : public Graph::EdgeIt { 
 
    52       EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
 
    53       EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
 
    54       EdgeIt(const TrivGraphWrapper<Graph>& _G) : 
 
    55 	Graph::EdgeIt(*(_G.graph)) { }
 
    58     NodeIt& first(NodeIt& i) const { 
 
    62     EdgeIt& first(EdgeIt& i) const { 
 
    66 //     template<typename I> I& first(I& i) const { 
 
    70     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
 
    71       i=OutEdgeIt(*this, p);
 
    74     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
 
    78 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
    83 //    template<typename I> I getNext(const I& i) const { 
 
    84 //      return graph->getNext(i); }
 
    85     template<typename I> I& next(I &i) const { graph->next(i); return i; }    
 
    87     template< typename It > It first() const { 
 
    88       It e; this->first(e); return e; }
 
    90     template< typename It > It first(const Node& v) const { 
 
    91       It e; this->first(e, v); return e; }
 
    93     Node head(const Edge& e) const { return graph->head(e); }
 
    94     Node tail(const Edge& e) const { return graph->tail(e); }
 
    96     template<typename I> bool valid(const I& i) const { 
 
    97       return graph->valid(i); }
 
    99     //template<typename I> void setInvalid(const I &i);
 
   100     //{ return graph->setInvalid(i); }
 
   102     int nodeNum() const { return graph->nodeNum(); }
 
   103     int edgeNum() const { return graph->edgeNum(); }
 
   105     template<typename I> Node aNode(const I& e) const { 
 
   106       return graph->aNode(e); }
 
   107     template<typename I> Node bNode(const I& e) const { 
 
   108       return graph->bNode(e); }
 
   110     Node addNode() const { return graph->addNode(); }
 
   111     Edge addEdge(const Node& tail, const Node& head) const { 
 
   112       return graph->addEdge(tail, head); }
 
   114     template<typename I> void erase(const I& i) const { graph->erase(i); }
 
   116     void clear() const { graph->clear(); }
 
   118     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
 
   120       NodeMap(const TrivGraphWrapper<Graph>& _G) :  
 
   121 	Graph::NodeMap<T>(*(_G.graph)) { }
 
   122       NodeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
 
   123 	Graph::NodeMap<T>(*(_G.graph), a) { }
 
   126     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
 
   128       EdgeMap(const TrivGraphWrapper<Graph>& _G) :  
 
   129 	Graph::EdgeMap<T>(*(_G.graph)) { }
 
   130       EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
 
   131 	Graph::EdgeMap<T>(*(_G.graph), a) { }
 
   134     template<typename Map, typename T> class NodeMapWrapper {
 
   138       NodeMapWrapper(Map& _map) : map(&_map) { }
 
   139       void set(Node n, T a) { map->set(n, a); }
 
   140       T get(Node n) const { return map->get(n); }
 
   143     template<typename Map, typename T> class EdgeMapWrapper {
 
   147       EdgeMapWrapper(Map& _map) : map(&_map) { }
 
   148       void set(Edge n, T a) { map->set(n, a); }
 
   149       T get(Edge n) const { return map->get(n); }
 
   154   template<typename Graph>
 
   160     typedef Graph BaseGraph;
 
   162 //     GraphWrapper() : graph(0) { }
 
   163     GraphWrapper(Graph& _graph) : graph(&_graph) { }
 
   164 //     void setGraph(Graph& _graph) { graph=&_graph; }
 
   165 //     Graph& getGraph() const { return *graph; }
 
   167     typedef typename Graph::Node Node;
 
   168     class NodeIt : public Graph::NodeIt { 
 
   171       NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
 
   172       NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
 
   173       NodeIt(const GraphWrapper<Graph>& _G) : 
 
   174 	Graph::NodeIt(*(_G.graph)) { }
 
   176     typedef typename Graph::Edge Edge;
 
   177     class OutEdgeIt : public Graph::OutEdgeIt { 
 
   180       OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
 
   181       OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
 
   182       OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& n) : 
 
   183 	Graph::OutEdgeIt(*(_G.graph), n) { }
 
   185     class InEdgeIt : public Graph::InEdgeIt { 
 
   188       InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
 
   189       InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
 
   190       InEdgeIt(const GraphWrapper<Graph>& _G, const Node& n) : 
 
   191 	Graph::InEdgeIt(*(_G.graph), n) { }
 
   193     //typedef typename Graph::SymEdgeIt SymEdgeIt;
 
   194     class EdgeIt : public Graph::EdgeIt { 
 
   197       EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
 
   198       EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
 
   199       EdgeIt(const GraphWrapper<Graph>& _G) : 
 
   200 	Graph::EdgeIt(*(_G.graph)) { }
 
   203     NodeIt& first(NodeIt& i) const { 
 
   207     EdgeIt& first(EdgeIt& i) const { 
 
   211 //     template<typename I> I& first(I& i) const {       
 
   215     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
 
   216       i=OutEdgeIt(*this, p);
 
   219     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
 
   220       i=InEdgeIt(*this, p);
 
   223 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
   228 //    template<typename I> I getNext(const I& i) const { 
 
   229 //      return gw.getNext(i); }
 
   230     template<typename I> I& next(I &i) const { graph->next(i); return i; }    
 
   232     template< typename It > It first() const { 
 
   233       It e; this->first(e); return e; }
 
   235     template< typename It > It first(const Node& v) const { 
 
   236       It e; this->first(e, v); return e; }
 
   238     Node head(const Edge& e) const { return graph->head(e); }
 
   239     Node tail(const Edge& e) const { return graph->tail(e); }
 
   241     template<typename I> bool valid(const I& i) const { 
 
   242       return graph->valid(i); }
 
   244     //template<typename I> void setInvalid(const I &i);
 
   245     //{ return graph->setInvalid(i); }
 
   247     int nodeNum() const { return graph->nodeNum(); }
 
   248     int edgeNum() const { return graph->edgeNum(); }
 
   250     template<typename I> Node aNode(const I& e) const { 
 
   251       return graph->aNode(e); }
 
   252     template<typename I> Node bNode(const I& e) const { 
 
   253       return graph->bNode(e); }
 
   255     Node addNode() const { return graph->addNode(); }
 
   256     Edge addEdge(const Node& tail, const Node& head) const { 
 
   257       return graph->addEdge(tail, head); }
 
   259     template<typename I> void erase(const I& i) const { graph->erase(i); }
 
   261     void clear() const { graph->clear(); }
 
   263     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
 
   265       NodeMap(const GraphWrapper<Graph>& _G) :  
 
   266 	Graph::NodeMap<T>(*(_G.graph)) { }
 
   267       NodeMap(const GraphWrapper<Graph>& _G, T a) : 
 
   268 	Graph::NodeMap<T>(*(_G.graph), a) { }
 
   271     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
 
   273       EdgeMap(const GraphWrapper<Graph>& _G) :  
 
   274 	Graph::EdgeMap<T>(*(_G.graph)) { }
 
   275       EdgeMap(const GraphWrapper<Graph>& _G, T a) : 
 
   276 	Graph::EdgeMap<T>(*(_G.graph), a) { }
 
   281 //   template<typename Graph>
 
   282 //   class RevGraphWrapper
 
   288 //     typedef Graph BaseGraph;
 
   290 //     typedef typename Graph::Node Node;    
 
   291 //     typedef typename Graph::NodeIt NodeIt;
 
   293 //     typedef typename Graph::Edge Edge;
 
   294 //     typedef typename Graph::OutEdgeIt InEdgeIt;
 
   295 //     typedef typename Graph::InEdgeIt OutEdgeIt;
 
   296 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
 
   297 //     typedef typename Graph::EdgeIt EdgeIt;
 
   299 //     //RevGraphWrapper() : graph(0) { }
 
   300 //     RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
 
   302 //     void setGraph(Graph& _graph) { graph = &_graph; }
 
   303 //     Graph& getGraph() const { return (*graph); }
 
   305 //     template<typename I> I& first(I& i) const { return graph->first(i); }
 
   306 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
   307 //       return graph->first(i, p); }
 
   309 //     template<typename I> I getNext(const I& i) const { 
 
   310 //       return graph->getNext(i); }
 
   311 //     template<typename I> I& next(I &i) const { return graph->next(i); }    
 
   313 //     template< typename It > It first() const { 
 
   314 //       It e; first(e); return e; }
 
   316 //     template< typename It > It first(const Node& v) const { 
 
   317 //       It e; first(e, v); return e; }
 
   319 //     Node head(const Edge& e) const { return graph->tail(e); }
 
   320 //     Node tail(const Edge& e) const { return graph->head(e); }
 
   322 //     template<typename I> bool valid(const I& i) const 
 
   323 //       { return graph->valid(i); }
 
   325 //     //template<typename I> void setInvalid(const I &i);
 
   326 //     //{ return graph->setInvalid(i); }
 
   328 //     template<typename I> Node aNode(const I& e) const { 
 
   329 //       return graph->aNode(e); }
 
   330 //     template<typename I> Node bNode(const I& e) const { 
 
   331 //       return graph->bNode(e); }
 
   333 //     Node addNode() const { return graph->addNode(); }
 
   334 //     Edge addEdge(const Node& tail, const Node& head) const { 
 
   335 //       return graph->addEdge(tail, head); }
 
   337 //     int nodeNum() const { return graph->nodeNum(); }
 
   338 //     int edgeNum() const { return graph->edgeNum(); }
 
   340 //     template<typename I> void erase(const I& i) const { graph->erase(i); }
 
   342 //     void clear() const { graph->clear(); }
 
   344 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
 
   346 //       NodeMap(const RevGraphWrapper<Graph>& _G) : 
 
   347 // 	Graph::NodeMap<T>(_G.getGraph()) { }
 
   348 //       NodeMap(const RevGraphWrapper<Graph>& _G, T a) : 
 
   349 // 	Graph::NodeMap<T>(_G.getGraph(), a) { }
 
   352 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
 
   354 //       EdgeMap(const RevGraphWrapper<Graph>& _G) : 
 
   355 // 	Graph::EdgeMap<T>(_G.getGraph()) { }
 
   356 //       EdgeMap(const RevGraphWrapper<Graph>& _G, T a) : 
 
   357 // 	Graph::EdgeMap<T>(_G.getGraph(), a) { }
 
   362   template<typename Graph>
 
   363   class RevGraphWrapper : public GraphWrapper<Graph> {
 
   365     typedef typename GraphWrapper<Graph>::Node Node;
 
   366     typedef typename GraphWrapper<Graph>::Edge Edge;
 
   368     //If Graph::OutEdgeIt is not defined
 
   369     //and we do not want to use RevGraphWrapper::InEdgeIt,
 
   370     //this won't work, because of typedef
 
   372     //graphs have to define their non-existing iterators to void
 
   373     //Unfortunately all the typedefs are instantiated in templates, 
 
   375     typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
 
   376     typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
 
   378 //     RevGraphWrapper() : GraphWrapper<Graph>() { }
 
   379     RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
 
   381     Node head(const Edge& e) const 
 
   382       { return GraphWrapper<Graph>::tail(e); }
 
   383     Node tail(const Edge& e) const 
 
   384       { return GraphWrapper<Graph>::head(e); }
 
   387   //Subgraph on the same node-set and partial edge-set
 
   388   template<typename Graph, typename EdgeFilterMap>
 
   389   class SubGraphWrapper : public GraphWrapper<Graph> {
 
   391     EdgeFilterMap* filter_map;
 
   393     typedef typename GraphWrapper<Graph>::Node Node;
 
   394     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
 
   395     typedef typename GraphWrapper<Graph>::Edge Edge;
 
   396     typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
 
   397     typedef typename GraphWrapper<Graph>::InEdgeIt InEdgeIt;
 
   398     typedef typename GraphWrapper<Graph>::OutEdgeIt OutEdgeIt;
 
   400 //     SubGraphWrapper() : GraphWrapper<Graph>(), filter_map(0) { }
 
   401     SubGraphWrapper(Graph& _graph, EdgeFilterMap& _filter_map) : 
 
   402       GraphWrapper<Graph>(_graph), filter_map(&_filter_map) { }  
 
   404     template<typename I> I& first(I& i) const { 
 
   406       while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
 
   409     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
   411       while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
 
   415     //template<typename I> I getNext(const I& i) const { 
 
   416     //  return gw.getNext(i); 
 
   418     template<typename I> I& next(I &i) const { 
 
   420       while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
 
   424     template< typename It > It first() const { 
 
   425       It e; this->first(e); return e; }
 
   427     template< typename It > It first(const Node& v) const { 
 
   428       It e; this->first(e, v); return e; }
 
   431 //   template<typename GraphWrapper>
 
   432 //   class UndirGraphWrapper {
 
   438 //     typedef GraphWrapper BaseGraph;
 
   440 //     typedef typename GraphWrapper::Node Node;
 
   441 //     typedef typename GraphWrapper::NodeIt NodeIt;
 
   443 //     //typedef typename Graph::Edge Edge;
 
   444 //     //typedef typename Graph::OutEdgeIt OutEdgeIt;
 
   445 //     //typedef typename Graph::InEdgeIt InEdgeIt;
 
   446 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
 
   447 //     //typedef typename Graph::EdgeIt EdgeIt;
 
   450 //     typedef typename GraphWrapper::Edge GraphEdge;
 
   451 //     typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt;
 
   452 //     typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt;
 
   455 //     //UndirGraphWrapper() : graph(0) { }
 
   456 //     UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { }
 
   458 //     //void setGraph(Graph& _graph) { graph = &_graph; }
 
   459 //     //Graph& getGraph() const { return (*graph); }
 
   462 //       friend class UndirGraphWrapper<GraphWrapper>;
 
   463 //       bool out_or_in; //true iff out
 
   464 //       GraphOutEdgeIt out;
 
   467 //       Edge() : out_or_in(), out(), in() { }
 
   468 //       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
 
   469 //       operator GraphEdge() const {
 
   470 // 	if (out_or_in) return(out); else return(in);
 
   472 //       friend bool operator==(const Edge& u, const Edge& v) { 
 
   474 // 	  return (u.out_or_in && u.out==v.out);
 
   476 // 	  return (!u.out_or_in && u.in==v.in);
 
   478 //       friend bool operator!=(const Edge& u, const Edge& v) { 
 
   480 // 	  return (!u.out_or_in || u.out!=v.out);
 
   482 // 	  return (u.out_or_in || u.in!=v.in);
 
   486 //     class OutEdgeIt : public Edge {
 
   487 //       friend class UndirGraphWrapper<GraphWrapper>;
 
   489 //       OutEdgeIt() : Edge() { }
 
   490 //       OutEdgeIt(const Invalid& i) : Edge(i) { }
 
   491 //       OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n) 
 
   494 // 	_G.gw.first(out, n);
 
   495 // 	if (!(_G.gw.valid(out))) {
 
   497 // 	  _G.gw.first(in, n);
 
   502 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
 
   504 //       gw.first(e.out, n);
 
   505 //       if (!(gw.valid(e.out))) {
 
   506 // 	e.out_or_in=false;
 
   507 // 	gw.first(e.in, n);
 
   512 //     OutEdgeIt& next(OutEdgeIt& e) const {
 
   513 //       if (e.out_or_in) {
 
   514 // 	Node n=gw.tail(e.out);
 
   516 // 	if (!gw.valid(e.out)) {
 
   517 // 	  e.out_or_in=false;
 
   518 // 	  gw.first(e.in, n);
 
   526 //     Node aNode(const OutEdgeIt& e) const { 
 
   527 //       if (e.out_or_in) return gw.tail(e); else return gw.head(e); }
 
   528 //     Node bNode(const OutEdgeIt& e) const { 
 
   529 //       if (e.out_or_in) return gw.head(e); else return gw.tail(e); }
 
   531 //     typedef OutEdgeIt InEdgeIt; 
 
   533 //     template<typename I> I& first(I& i) const { return gw.first(i); }
 
   534 // //     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
   535 // //       return graph->first(i, p); }
 
   537 //     template<typename I> I getNext(const I& i) const { 
 
   538 //       return gw.getNext(i); }
 
   539 //     template<typename I> I& next(I &i) const { return gw.next(i); }    
 
   541 //     template< typename It > It first() const { 
 
   542 //       It e; first(e); return e; }
 
   544 //     template< typename It > It first(const Node& v) const { 
 
   545 //       It e; first(e, v); return e; }
 
   547 //     Node head(const Edge& e) const { return gw.head(e); }
 
   548 //     Node tail(const Edge& e) const { return gw.tail(e); }
 
   550 //     template<typename I> bool valid(const I& i) const 
 
   551 //       { return gw.valid(i); }
 
   553 //     //template<typename I> void setInvalid(const I &i);
 
   554 //     //{ return graph->setInvalid(i); }
 
   556 //     int nodeNum() const { return gw.nodeNum(); }
 
   557 //     int edgeNum() const { return gw.edgeNum(); }
 
   559 // //     template<typename I> Node aNode(const I& e) const { 
 
   560 // //       return graph->aNode(e); }
 
   561 // //     template<typename I> Node bNode(const I& e) const { 
 
   562 // //       return graph->bNode(e); }
 
   564 //     Node addNode() const { return gw.addNode(); }
 
   565 // // FIXME: ez igy nem jo, mert nem
 
   566 // //    Edge addEdge(const Node& tail, const Node& head) const { 
 
   567 // //      return graph->addEdge(tail, head); }
 
   569 //     template<typename I> void erase(const I& i) const { gw.erase(i); }
 
   571 //     void clear() const { gw.clear(); }
 
   573 //     template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> { 
 
   575 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) : 
 
   576 // 	GraphWrapper::NodeMap<T>(_G.gw) { }
 
   577 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) : 
 
   578 // 	GraphWrapper::NodeMap<T>(_G.gw, a) { }
 
   581 //     template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> { 
 
   583 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) : 
 
   584 // 	GraphWrapper::EdgeMap<T>(_G.gw) { }
 
   585 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) : 
 
   586 // 	GraphWrapper::EdgeMap<T>(_G.gw, a) { }
 
   591   template<typename Graph>
 
   592   class UndirGraphWrapper : public GraphWrapper<Graph> {
 
   594     typedef typename Graph::Edge GraphEdge;
 
   595     typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
 
   596     typedef typename Graph::InEdgeIt GraphInEdgeIt;    
 
   598     typedef typename GraphWrapper<Graph>::Node Node;
 
   599     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
 
   601 //     UndirGraphWrapper() : GraphWrapper<Graph>() { }
 
   602     UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
 
   605       friend class UndirGraphWrapper<Graph>;
 
   607       bool out_or_in; //true iff out
 
   611       Edge() : out_or_in(), out(), in() { }
 
   612       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
 
   613       operator GraphEdge() const {
 
   614 	if (out_or_in) return(out); else return(in);
 
   617 //2 edges are equal if they "refer" to the same physical edge 
 
   619       friend bool operator==(const Edge& u, const Edge& v) { 
 
   621 	  if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in);
 
   622 	//return (u.out_or_in && u.out==v.out);
 
   624 	  if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in);
 
   625 	//return (!u.out_or_in && u.in==v.in);
 
   627       friend bool operator!=(const Edge& u, const Edge& v) { 
 
   629 	  if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in);
 
   630 	//return (!u.out_or_in || u.out!=v.out);
 
   632 	  if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in);
 
   633 	//return (u.out_or_in || u.in!=v.in);
 
   637     class OutEdgeIt : public Edge {
 
   638       friend class UndirGraphWrapper<Graph>;
 
   640       OutEdgeIt() : Edge() { }
 
   641       OutEdgeIt(const Invalid& i) : Edge(i) { }
 
   642       OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& n) 
 
   644 	out_or_in=true; _G.graph->first(out, n);
 
   645 	if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, n);	}
 
   649     typedef OutEdgeIt InEdgeIt; 
 
   651     class EdgeIt : public Edge {
 
   652       friend class UndirGraphWrapper<Graph>;
 
   656       EdgeIt() : Edge() { }
 
   657       EdgeIt(const Invalid& i) : Edge(i) { }
 
   658       EdgeIt(const UndirGraphWrapper<Graph>& _G) 
 
   663 	if (_G.valid(v)) _G.graph->first(out); else out=INVALID;
 
   664 	while (_G.valid(v) && !_G.graph->valid(out)) { 
 
   666 	  if (_G.valid(v)) _G.graph->first(out); 
 
   671     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
 
   672       e.out_or_in=true; graph->first(e.out, n);
 
   673       if (!(graph->valid(e.out))) { e.out_or_in=false; graph->first(e.in, n); }
 
   677     EdgeIt& first(EdgeIt& e) const {
 
   681       if (valid(e.v)) graph->first(e.out, e.v); else e.out=INVALID;
 
   682       while (valid(e.v) && !graph->valid(e.out)) { 
 
   684 	if (valid(e.v)) graph->first(e.out, e.v); 
 
   689     template<typename I> I& first(I& i) const { graph->first(i); return i; }
 
   690     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
   691       graph->first(i, p); return i; }
 
   693     OutEdgeIt& next(OutEdgeIt& e) const {
 
   695 	Node n=graph->tail(e.out);
 
   697 	if (!graph->valid(e.out)) { e.out_or_in=false; graph->first(e.in, n); }
 
   704     EdgeIt& next(EdgeIt& e) const {
 
   707       while (valid(e.v) && !graph->valid(e.out)) { 
 
   709 	if (valid(e.v)) graph->first(e.out, e.v); 
 
   714     template<typename I> I& next(I &i) const { return graph->next(i); }    
 
   715 //    template<typename I> I getNext(const I& i) const { return gw.getNext(i); }
 
   717     template< typename It > It first() const { 
 
   718       It e; this->first(e); return e; }
 
   720     template< typename It > It first(const Node& v) const { 
 
   721       It e; this->first(e, v); return e; }
 
   723 //    Node head(const Edge& e) const { return gw.head(e); }
 
   724 //    Node tail(const Edge& e) const { return gw.tail(e); }
 
   726 //    template<typename I> bool valid(const I& i) const 
 
   727 //      { return gw.valid(i); }
 
   729 //    int nodeNum() const { return gw.nodeNum(); }
 
   730 //    int edgeNum() const { return gw.edgeNum(); }
 
   732 //     template<typename I> Node aNode(const I& e) const { 
 
   733 //       return graph->aNode(e); }
 
   734 //     template<typename I> Node bNode(const I& e) const { 
 
   735 //       return graph->bNode(e); }
 
   737     Node aNode(const OutEdgeIt& e) const { 
 
   738       if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
 
   739     Node bNode(const OutEdgeIt& e) const { 
 
   740       if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
 
   742 //    Node addNode() const { return gw.addNode(); }
 
   744 // FIXME: ez igy nem jo, mert nem
 
   745 //    Edge addEdge(const Node& tail, const Node& head) const { 
 
   746 //      return graph->addEdge(tail, head); }
 
   748 //    template<typename I> void erase(const I& i) const { gw.erase(i); }
 
   750 //    void clear() const { gw.clear(); }
 
   752 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
 
   754 //       NodeMap(const UndirGraphWrapper<Graph>& _G) : 
 
   755 // 	Graph::NodeMap<T>(_G.gw) { }
 
   756 //       NodeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
 
   757 // 	Graph::NodeMap<T>(_G.gw, a) { }
 
   760 //     template<typename T> class EdgeMap : 
 
   761 //       public GraphWrapperSkeleton<Graph>::EdgeMap<T> { 
 
   763 //       EdgeMap(const UndirGraphWrapper<Graph>& _G) : 
 
   764 // 	GraphWrapperSkeleton<Graph>::EdgeMap<T>(_G.gw) { }
 
   765 //       EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
 
   766 // 	Graph::EdgeMap<T>(_G.gw, a) { }
 
   774 //   template<typename Graph>
 
   775 //   class SymGraphWrapper
 
   780 //     typedef Graph BaseGraph;
 
   782 //     typedef typename Graph::Node Node;
 
   783 //     typedef typename Graph::Edge Edge;
 
   785 //     typedef typename Graph::NodeIt NodeIt;
 
   787 //     //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
 
   788 //     //iranyitatlant, ami van
 
   789 //     //mert csak 1 dolgot lehet be typedef-elni
 
   790 //     typedef typename Graph::OutEdgeIt SymEdgeIt;
 
   791 //     //typedef typename Graph::InEdgeIt SymEdgeIt;
 
   792 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
 
   793 //     typedef typename Graph::EdgeIt EdgeIt;
 
   795 //     int nodeNum() const { return graph->nodeNum(); }
 
   796 //     int edgeNum() const { return graph->edgeNum(); }
 
   798 //     template<typename I> I& first(I& i) const { return graph->first(i); }
 
   799 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
   800 //       return graph->first(i, p); }
 
   801 //     //template<typename I> I next(const I i); { return graph->goNext(i); }
 
   802 //     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
 
   804 //     template< typename It > It first() const { 
 
   805 //       It e; first(e); return e; }
 
   807 //     template< typename It > It first(Node v) const { 
 
   808 //       It e; first(e, v); return e; }
 
   810 //     Node head(const Edge& e) const { return graph->head(e); }
 
   811 //     Node tail(const Edge& e) const { return graph->tail(e); }
 
   813 //     template<typename I> Node aNode(const I& e) const { 
 
   814 //       return graph->aNode(e); }
 
   815 //     template<typename I> Node bNode(const I& e) const { 
 
   816 //       return graph->bNode(e); }
 
   818 //     //template<typename I> bool valid(const I i);
 
   819 //     //{ return graph->valid(i); }
 
   821 //     //template<typename I> void setInvalid(const I &i);
 
   822 //     //{ return graph->setInvalid(i); }
 
   824 //     Node addNode() { return graph->addNode(); }
 
   825 //     Edge addEdge(const Node& tail, const Node& head) { 
 
   826 //       return graph->addEdge(tail, head); }
 
   828 //     template<typename I> void erase(const I& i) { graph->erase(i); }
 
   830 //     void clear() { graph->clear(); }
 
   832 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { };
 
   833 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
 
   835 //     void setGraph(Graph& _graph) { graph = &_graph; }
 
   836 //     Graph& getGraph() { return (*graph); }
 
   838 //     //SymGraphWrapper() : graph(0) { }
 
   839 //     SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
 
   843   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
 
   844   class ResGraphWrapper : public GraphWrapper<Graph>{
 
   846     typedef typename GraphWrapper<Graph>::Node Node;
 
   847     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
 
   849     typedef typename Graph::OutEdgeIt OldOutEdgeIt;
 
   850     typedef typename Graph::InEdgeIt OldInEdgeIt;
 
   852     const CapacityMap* capacity;
 
   855     ResGraphWrapper(Graph& _graph, FlowMap& _flow, 
 
   856 		    const CapacityMap& _capacity) : 
 
   857       GraphWrapper<Graph>(_graph), flow(&_flow), capacity(&_capacity) { }
 
   862     friend class OutEdgeIt; 
 
   865       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
 
   867       bool out_or_in; //true, iff out
 
   871       Edge() : out_or_in(true) { } 
 
   872       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
 
   873 //       bool valid() const { 
 
   874 // 	return out_or_in && out.valid() || in.valid(); }
 
   875       friend bool operator==(const Edge& u, const Edge& v) { 
 
   877 	  return (u.out_or_in && u.out==v.out);
 
   879 	  return (!u.out_or_in && u.in==v.in);
 
   881       friend bool operator!=(const Edge& u, const Edge& v) { 
 
   883 	  return (!u.out_or_in || u.out!=v.out);
 
   885 	  return (u.out_or_in || u.in!=v.in);
 
   890     class OutEdgeIt : public Edge {
 
   891       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
 
   895       OutEdgeIt(const Edge& e) : Edge(e) { }
 
   896       OutEdgeIt(const Invalid& i) : Edge(i) { }
 
   898       OutEdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() { 
 
   899 	resG.graph->first(out, v);
 
   900 	while( resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
 
   901 	if (!resG.graph->valid(out)) {
 
   903 	  resG.graph->first(in, v);
 
   904 	  while( resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
 
   908 //       OutEdgeIt& operator++() { 
 
   910 // 	  Node v=/*resG->*/G->aNode(out);
 
   912 // 	  while( out.valid() && !(Edge::resCap()>0) ) { ++out; }
 
   913 // 	  if (!out.valid()) {
 
   916 // 	    while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
 
   920 // 	  while( in.valid() && !(Edge::resCap()>0) ) { ++in; } 
 
   926     //FIXME This is just for having InEdgeIt
 
   927     typedef void InEdgeIt;
 
   929     class EdgeIt : public Edge {
 
   930       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
 
   934       //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
 
   935       EdgeIt(const Invalid& i) : Edge(i) { }
 
   936       EdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG) : Edge() { 
 
   937 	resG.graph->first(v);
 
   938 	if (resG.graph->valid(v)) resG.graph->first(out, v); else out=INVALID;
 
   939 	while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
 
   940 	while (resG.graph->valid(v) && !resG.graph->valid(out)) { 
 
   942 	  if (resG.graph->valid(v)) resG.graph->first(out, v); 
 
   943 	  while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
 
   945 	if (!resG.graph->valid(out)) {
 
   947 	  resG.graph->first(v);
 
   948 	  if (resG.graph->valid(v)) resG.graph->first(in, v); else in=INVALID;
 
   949 	  while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
 
   950 	  while (resG.graph->valid(v) && !resG.graph->valid(in)) { 
 
   952 	    if (resG.graph->valid(v)) resG.graph->first(in, v); 
 
   953 	    while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
 
   957 //       EdgeIt& operator++() { 
 
   960 // 	  while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
 
   961 // 	  while (v.valid() && !out.valid()) { 
 
   963 // 	    if (v.valid()) G->first(out, v); 
 
   964 // 	    while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
 
   966 // 	  if (!out.valid()) {
 
   969 // 	    if (v.valid()) G->first(in, v); else in=OldInEdgeIt();
 
   970 // 	    while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
 
   971 // 	    while (v.valid() && !in.valid()) { 
 
   973 // 	      if (v.valid()) G->first(in, v); 
 
   974 // 	      while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
 
   979 // 	  while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
 
   980 // 	  while (v.valid() && !in.valid()) { 
 
   982 // 	    if (v.valid()) G->first(in, v); 
 
   983 // 	    while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
 
   990     NodeIt& first(NodeIt& v) const { graph->first(v); return v; }
 
   991     OutEdgeIt& first(OutEdgeIt& e, Node v) const { 
 
   992       e=OutEdgeIt(*this, v); 
 
   995     EdgeIt& first(EdgeIt& e) const { 
 
  1000     NodeIt& next(NodeIt& n) const { return graph->next(n); }
 
  1002     OutEdgeIt& next(OutEdgeIt& e) const { 
 
  1004 	Node v=graph->aNode(e.out);
 
  1006 	while( graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
 
  1007 	if (!graph->valid(e.out)) {
 
  1009 	  graph->first(e.in, v); 
 
  1010 	  while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
 
  1014 	while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); } 
 
  1019     EdgeIt& next(EdgeIt& e) const { 
 
  1022 	while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
 
  1023 	  while (graph->valid(e.v) && !graph->valid(e.out)) { 
 
  1025 	    if (graph->valid(e.v)) graph->first(e.out, e.v); 
 
  1026 	    while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
 
  1028 	  if (!graph->valid(e.out)) {
 
  1031 	    if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=INVALID;
 
  1032 	    while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
 
  1033 	    while (graph->valid(e.v) && !graph->valid(e.in)) { 
 
  1035 	      if (graph->valid(e.v)) graph->first(e.in, e.v); 
 
  1036 	      while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
 
  1041 	  while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
 
  1042 	  while (graph->valid(e.v) && !graph->valid(e.in)) { 
 
  1044 	    if (graph->valid(e.v)) graph->first(e.in, e.v); 
 
  1045 	    while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
 
  1052     template< typename It >
 
  1059     template< typename It >
 
  1060     It first(Node v) const { 
 
  1066     Node tail(Edge e) const { 
 
  1067       return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
 
  1068     Node head(Edge e) const { 
 
  1069       return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
 
  1071     Node aNode(OutEdgeIt e) const { 
 
  1072       return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
 
  1073     Node bNode(OutEdgeIt e) const { 
 
  1074       return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
 
  1076     int nodeNum() const { return graph->nodeNum(); }
 
  1078     //int edgeNum() const { return graph->edgeNum(); }
 
  1081     int id(Node v) const { return graph->id(v); }
 
  1083     bool valid(Node n) const { return graph->valid(n); }
 
  1084     bool valid(Edge e) const { 
 
  1085       return e.out_or_in ? graph->valid(e.out) : graph->valid(e.in); }
 
  1087     void augment(const Edge& e, Number a) const {
 
  1089 	flow->set(e.out, flow->get(e.out)+a);
 
  1091 	flow->set(e.in, flow->get(e.in)-a);
 
  1094     Number resCap(const Edge& e) const { 
 
  1096 	return (capacity->get(e.out)-flow->get(e.out)); 
 
  1098 	return (flow->get(e.in)); 
 
  1101     Number resCap(OldOutEdgeIt out) const { 
 
  1102       return (capacity->get(out)-flow->get(out)); 
 
  1105     Number resCap(OldInEdgeIt in) const { 
 
  1106       return (flow->get(in)); 
 
  1109 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
 
  1111 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) 
 
  1112 // 	: Graph::NodeMap<T>(_G.gw) { }
 
  1113 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, 
 
  1114 // 	      T a) : Graph::NodeMap<T>(_G.gw, a) { }
 
  1117 //     template <typename T>
 
  1119 //       typename Graph::NodeMap<T> node_map; 
 
  1121 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
 
  1122 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
 
  1123 //       void set(Node nit, T a) { node_map.set(nit, a); }
 
  1124 //       T get(Node nit) const { return node_map.get(nit); }
 
  1127     template <typename T>
 
  1129       typename Graph::EdgeMap<T> forward_map, backward_map; 
 
  1131       EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
 
  1132       EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
 
  1133       void set(Edge e, T a) { 
 
  1135 	  forward_map.set(e.out, a); 
 
  1137 	  backward_map.set(e.in, a); 
 
  1141 	  return forward_map.get(e.out); 
 
  1143 	  return backward_map.get(e.in); 
 
  1148   //ErasingFirstGraphWrapper for blocking flows
 
  1149   template<typename Graph, typename FirstOutEdgesMap>
 
  1150   class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
 
  1152     FirstOutEdgesMap* first_out_edges;
 
  1154     typedef typename GraphWrapper<Graph>::Node Node;
 
  1155     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
 
  1156     typedef typename GraphWrapper<Graph>::Edge Edge;
 
  1157     typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
 
  1158     typedef typename GraphWrapper<Graph>::InEdgeIt InEdgeIt;
 
  1159     typedef typename GraphWrapper<Graph>::OutEdgeIt OutEdgeIt;
 
  1161     ErasingFirstGraphWrapper(Graph& _graph, 
 
  1162 			     FirstOutEdgesMap& _first_out_edges) : 
 
  1163       GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }  
 
  1165     template<typename I> I& first(I& i) const { 
 
  1169     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
 
  1170       e=first_out_edges->get(n);
 
  1173     template<typename I, typename P> I& first(I& i, const P& p) const { 
 
  1178     //template<typename I> I getNext(const I& i) const { 
 
  1179     //  return gw.getNext(i); 
 
  1181     template<typename I> I& next(I &i) const { 
 
  1186     template< typename It > It first() const { 
 
  1187       It e; this->first(e); return e; }
 
  1189     template< typename It > It first(const Node& v) const { 
 
  1190       It e; this->first(e, v); return e; }
 
  1192     void erase(const OutEdgeIt& e) const {
 
  1195       first_out_edges->set(this->tail(e), f);
 
  1199 // // FIXME: comparison should be made better!!!
 
  1200 //   template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
 
  1201 //   class ResGraphWrapper
 
  1206 //     typedef Graph BaseGraph;
 
  1208 //     typedef typename Graph::Node Node;
 
  1209 //     typedef typename Graph::Edge Edge;
 
  1211 //     typedef typename Graph::NodeIt NodeIt;
 
  1213 //     class OutEdgeIt {
 
  1217 //       typename Graph::OutEdgeIt o;
 
  1218 //       typename Graph::InEdgeIt i;   
 
  1224 //       typename Graph::OutEdgeIt o;
 
  1225 //       typename Graph::InEdgeIt i;   
 
  1227 //     typedef typename Graph::SymEdgeIt SymEdgeIt;
 
  1228 //     typedef typename Graph::EdgeIt EdgeIt;
 
  1230 //     int nodeNum() const { return gw.nodeNum(); }
 
  1231 //     int edgeNum() const { return gw.edgeNum(); }
 
  1233 //     Node& first(Node& n) const { return gw.first(n); }
 
  1235 //     // Edge and SymEdge  is missing!!!!
 
  1236 //     // Edge <-> In/OutEdgeIt conversion is missing!!!!
 
  1239 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const 
 
  1243 // 	while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
 
  1245 // 	if(!gw.valid(e.o)) {
 
  1247 // 	  while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
 
  1253 //   OutEdgeIt &goNext(OutEdgeIt &e)
 
  1255 //   if(gw.valid(e.o)) {
 
  1256 //   while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
 
  1258 //   if(gw.valid(e.o)) return e;
 
  1259 //   else gw.first(e.i,e.n);
 
  1262 //   while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
 
  1267 //   OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
 
  1269 //     //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);}
 
  1272 //     InEdgeIt& first(InEdgeIt& e, const Node& n) const 
 
  1276 // 	while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
 
  1278 // 	if(!gw.valid(e.i)) {
 
  1280 // 	  while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
 
  1286 //   InEdgeIt &goNext(InEdgeIt &e)
 
  1288 //   if(gw.valid(e.i)) {
 
  1289 //   while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
 
  1291 //   if(gw.valid(e.i)) return e;
 
  1292 //   else gw.first(e.o,e.n);
 
  1295 //   while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
 
  1300 //   InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
 
  1302 //     //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);}
 
  1304 //     //template<typename I> I &goNext(I &i); { return gw.goNext(i); }
 
  1305 //     //template<typename I> I next(const I i); { return gw.goNext(i); }
 
  1307 //     template< typename It > It first() const { 
 
  1308 //       It e; first(e); return e; }
 
  1310 //     template< typename It > It first(Node v) const { 
 
  1311 //       It e; first(e, v); return e; }
 
  1313 //     Node head(const Edge& e) const { return gw.head(e); }
 
  1314 //     Node tail(const Edge& e) const { return gw.tail(e); }
 
  1316 //     template<typename I> Node aNode(const I& e) const { 
 
  1317 //       return gw.aNode(e); }
 
  1318 //     template<typename I> Node bNode(const I& e) const { 
 
  1319 //       return gw.bNode(e); }
 
  1321 //     //template<typename I> bool valid(const I i);
 
  1322 //     //{ return gw.valid(i); }
 
  1324 //     //template<typename I> void setInvalid(const I &i);
 
  1325 //     //{ return gw.setInvalid(i); }
 
  1327 //     Node addNode() { return gw.addNode(); }
 
  1328 //     Edge addEdge(const Node& tail, const Node& head) { 
 
  1329 //       return gw.addEdge(tail, head); }
 
  1331 //     template<typename I> void erase(const I& i) { gw.erase(i); }
 
  1333 //     void clear() { gw.clear(); }
 
  1335 //     template<typename S> class NodeMap : public Graph::NodeMap<S> { };
 
  1336 //     template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
 
  1338 //     void setGraph(Graph& _graph) { graph = &_graph; }
 
  1339 //     Graph& getGraph() { return (*graph); }
 
  1341 //     //ResGraphWrapper() : graph(0) { }
 
  1342 //     ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
 
  1347 #endif //HUGO_GRAPH_WRAPPER_H