lemon/sub_graph.h
author ladanyi
Fri, 14 Apr 2006 14:57:59 +0000
changeset 2048 b1a605b2f03c
parent 1990 15fb7a4ea6be
child 2224 f973894da54e
permissions -rw-r--r--
make distcheck should work now
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_SUB_GRAPH_H
    20 #define LEMON_SUB_GRAPH_H
    21 
    22 #include <lemon/graph_adaptor.h>
    23 #include <lemon/bits/graph_adaptor_extender.h>
    24 #include <lemon/bits/default_map.h>
    25 
    26 namespace lemon {
    27 
    28   /// \brief Base for the SubGraph.
    29   ///
    30   /// Base for the SubGraph.
    31   template <typename _Graph>
    32   class SubGraphBase : public GraphAdaptorBase<const _Graph> {
    33   public:
    34     typedef _Graph Graph;
    35     typedef SubGraphBase<_Graph> SubGraph;
    36     typedef GraphAdaptorBase<const _Graph> Parent;
    37     typedef Parent Base;
    38 
    39     typedef typename Parent::Node Node;
    40     typedef typename Parent::Edge Edge;
    41 
    42 
    43   protected:
    44 
    45     class NodesImpl;
    46     class EdgesImpl;
    47 
    48     SubGraphBase() {}
    49 
    50     void construct(const Graph& _graph, NodesImpl& _nodes, EdgesImpl& _edges) {
    51       Parent::setGraph(_graph);
    52       nodes = &_nodes;
    53       edges = &_edges;
    54       firstNode = INVALID;
    55 
    56       Node node;
    57       Parent::first(node);
    58       while (node != INVALID) {
    59 	(*nodes)[node].prev = node;
    60 	(*nodes)[node].firstIn = INVALID;
    61 	(*nodes)[node].firstOut = INVALID;
    62 	Parent::next(node);
    63       }
    64 
    65       Edge edge;
    66       Parent::first(edge);
    67       while (edge != INVALID) {
    68 	(*edges)[edge].prevOut = edge;
    69 	Parent::next(edge);
    70       }
    71     }
    72 
    73   public:
    74 
    75     void first(Node& node) const {
    76       node = firstNode;
    77     }
    78     void next(Node& node) const {
    79       node = (*nodes)[node].next;
    80     }
    81 
    82     void first(Edge& edge) const {
    83       Node node = firstNode;
    84       while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
    85 	node = (*nodes)[node].next;
    86       }
    87       if (node == INVALID) {
    88 	edge = INVALID;
    89       } else {
    90 	edge = (*nodes)[node].firstOut;
    91       }
    92     }
    93     void next(Edge& edge) const {
    94       if ((*edges)[edge].nextOut != INVALID) {
    95 	edge = (*edges)[edge].nextOut;
    96       } else {
    97 	Node node = (*nodes)[source(edge)].next;
    98 	while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
    99 	  node = (*nodes)[node].next;
   100 	}
   101 	if (node == INVALID) {
   102 	  edge = INVALID;
   103 	} else {
   104 	  edge = (*nodes)[node].firstOut;
   105 	}
   106       }
   107     }
   108 
   109     void firstOut(Edge& edge, const Node& node) const {
   110       edge = (*nodes)[node].firstOut;
   111     }
   112     void nextOut(Edge& edge) const {
   113       edge = (*edges)[edge].nextOut;
   114     }
   115 
   116     void firstIn(Edge& edge, const Node& node) const {
   117       edge = (*nodes)[node].firstIn;
   118     }
   119     void nextIn(Edge& edge) const {
   120       edge = (*edges)[edge].nextIn;
   121     }
   122 
   123     /// \brief Returns true when the given node is hidden.
   124     ///
   125     /// Returns true when the given node is hidden.
   126     bool hidden(const Node& node) const {
   127       return (*nodes)[node].prev == node;
   128     }
   129 
   130     /// \brief Hide the given node in the sub-graph.
   131     ///
   132     /// Hide the given node in the sub graph. It just lace out from
   133     /// the linked lists the given node. If there are incoming or outgoing
   134     /// edges into or from this node then all of these will be hidden.
   135     void hide(const Node& node) {
   136       if (hidden(node)) return;
   137       Edge edge;
   138       firstOut(edge, node);
   139       while (edge != INVALID) {
   140 	hide(edge);
   141 	firstOut(edge, node);
   142       }
   143 
   144       firstOut(edge, node);
   145       while (edge != INVALID) {
   146 	hide(edge);
   147 	firstOut(edge, node);
   148       }
   149       if ((*nodes)[node].prev != INVALID) {
   150 	(*nodes)[(*nodes)[node].prev].next = (*nodes)[node].next;
   151       } else {
   152 	firstNode = (*nodes)[node].next;
   153       }
   154       if ((*nodes)[node].next != INVALID) {
   155 	(*nodes)[(*nodes)[node].next].prev = (*nodes)[node].prev;
   156       }
   157       (*nodes)[node].prev = node;
   158       (*nodes)[node].firstIn = INVALID;
   159       (*nodes)[node].firstOut = INVALID;
   160     }
   161 
   162     /// \brief Unhide the given node in the sub-graph.
   163     ///
   164     /// Unhide the given node in the sub graph. It just lace in the given
   165     /// node into the linked lists.
   166     void unHide(const Node& node) {
   167       if (!hidden(node)) return;
   168       (*nodes)[node].next = firstNode;
   169       (*nodes)[node].prev = INVALID;
   170       if ((*nodes)[node].next != INVALID) {
   171 	(*nodes)[(*nodes)[node].next].prev = node;
   172       }
   173       firstNode = node;
   174     }
   175 
   176     /// \brief Returns true when the given edge is hidden.
   177     ///
   178     /// Returns true when the given edge is hidden.
   179     bool hidden(const Edge& edge) const {
   180       return (*edges)[edge].prevOut == edge;
   181     }
   182 
   183     /// \brief Hide the given edge in the sub-graph.
   184     ///
   185     /// Hide the given edge in the sub graph. It just lace out from
   186     /// the linked lists the given edge.
   187     void hide(const Edge& edge) {
   188       if (hidden(edge)) return;
   189       if ((*edges)[edge].prevOut == edge) return;
   190       if ((*edges)[edge].prevOut != INVALID) {
   191 	(*edges)[(*edges)[edge].prevOut].nextOut = (*edges)[edge].nextOut;
   192       } else {
   193 	(*nodes)[source(edge)].firstOut = (*edges)[edge].nextOut;
   194       }
   195       if ((*edges)[edge].nextOut != INVALID) {
   196 	(*edges)[(*edges)[edge].nextOut].prevOut = (*edges)[edge].prevOut;
   197       }
   198 
   199       if ((*edges)[edge].prevIn != INVALID) {
   200 	(*edges)[(*edges)[edge].prevIn].nextIn = (*edges)[edge].nextIn;
   201       } else {
   202 	(*nodes)[target(edge)].firstIn = (*edges)[edge].nextIn;
   203       }
   204       if ((*edges)[edge].nextIn != INVALID) {
   205 	(*edges)[(*edges)[edge].nextIn].prevIn = (*edges)[edge].prevIn;
   206       }
   207       (*edges)[edge].next = edge;
   208     }
   209 
   210     /// \brief Unhide the given edge in the sub-graph.
   211     ///
   212     /// Unhide the given edge in the sub graph. It just lace in the given
   213     /// edge into the linked lists. If the source or the target of the
   214     /// node is hidden then it will unhide it.
   215     void unHide(const Edge& edge) {
   216       if (!hidden(edge)) return;
   217 
   218       Node node;
   219 
   220       node = Parent::source(edge);
   221       unHide(node);
   222       (*edges)[edge].nextOut = (*nodes)[node].firstOut;
   223       (*edges)[edge].prevOut = INVALID;
   224       if ((*edges)[edge].nextOut != INVALID) {
   225 	(*edges)[(*edges)[edge].nextOut].prevOut = edge;
   226       }
   227       (*nodes)[node].firstOut = edge;
   228 
   229       node = Parent::target(edge);
   230       unHide(node);
   231       (*edges)[edge].nextIn = (*nodes)[node].firstIn;
   232       (*edges)[edge].prevIn = INVALID;
   233       if ((*edges)[edge].nextIn != INVALID) {
   234 	(*edges)[(*edges)[edge].nextIn].prevIn = edge;
   235       }
   236       (*nodes)[node].firstIn = edge;      
   237     }
   238     
   239     typedef False NodeNumTag;
   240     typedef False EdgeNumTag;
   241 
   242   protected:
   243     struct NodeT {
   244       Node prev, next;
   245       Edge firstIn, firstOut;
   246     };
   247     class NodesImpl : public DefaultMap<Graph, Node, NodeT> {
   248       friend class SubGraphBase;
   249     public:
   250       typedef DefaultMap<Graph, Node, NodeT> Parent;
   251 
   252       NodesImpl(SubGraph& _adaptor, const Graph& _graph) 
   253 	: Parent(_graph), adaptor(_adaptor) {}
   254 
   255       virtual ~NodesImpl() {}
   256 
   257       virtual void build() {
   258 	Parent::build();
   259 	Node node;
   260 	adaptor.Base::first(node);
   261 	while (node != INVALID) {
   262 	  Parent::operator[](node).prev = node;
   263 	  Parent::operator[](node).firstIn = INVALID;
   264 	  Parent::operator[](node).firstOut = INVALID;
   265 	  adaptor.Base::next(node);
   266 	}
   267       }
   268 
   269       virtual void clear() {
   270 	adaptor.firstNode = INVALID;
   271 	Parent::clear();
   272       }
   273 
   274       virtual void add(const Node& node) {
   275 	Parent::add(node);
   276 	Parent::operator[](node).prev = node;
   277 	Parent::operator[](node).firstIn = INVALID;
   278 	Parent::operator[](node).firstOut = INVALID;
   279       }
   280 
   281       virtual void add(const std::vector<Node>& nodes) {
   282 	Parent::add(nodes);
   283 	for (int i = 0; i < (int)nodes.size(); ++i) {
   284 	  Parent::operator[](nodes[i]).prev = nodes[i];
   285 	  Parent::operator[](nodes[i]).firstIn = INVALID;
   286 	  Parent::operator[](nodes[i]).firstOut = INVALID;
   287 	}
   288       } 
   289 
   290       virtual void erase(const Node& node) {
   291 	adaptor.hide(node);
   292 	Parent::erase(node);
   293       }
   294 
   295       virtual void erase(const std::vector<Node>& nodes) {
   296 	for (int i = 0; i < (int)nodes.size(); ++i) {
   297 	  adaptor.hide(nodes[i]);
   298 	}
   299 	Parent::erase(nodes);
   300       }
   301 
   302     private:
   303       SubGraph& adaptor;
   304     };
   305 
   306     struct EdgeT {
   307       Edge prevOut, nextOut;
   308       Edge prevIn, nextIn;
   309     };
   310     class EdgesImpl : public DefaultMap<Graph, Edge, EdgeT> {
   311       friend class SubGraphBase;
   312     public:
   313       typedef DefaultMap<Graph, Edge, EdgeT> Parent;
   314 
   315       EdgesImpl(SubGraph& _adaptor, const Graph& _graph) 
   316 	: Parent(_graph), adaptor(_adaptor) {}
   317 
   318       virtual ~EdgesImpl() {}
   319 
   320       virtual void build() {
   321 	Parent::build();
   322 	Edge edge;
   323 	adaptor.Base::first(edge);
   324 	while (edge != INVALID) {
   325 	  Parent::operator[](edge).prevOut = edge;
   326 	  adaptor.Base::next(edge);
   327 	}
   328       }
   329 
   330       virtual void clear() {
   331 	Node node;
   332 	adaptor.first(node);
   333 	while (node != INVALID) {
   334 	  (*adaptor.nodes).firstIn = INVALID;
   335 	  (*adaptor.nodes).firstOut = INVALID;
   336 	  adaptor.next(node);
   337 	}
   338 	Parent::clear();
   339       }
   340 
   341       virtual void add(const Edge& edge) {
   342 	Parent::add(edge);
   343 	Parent::operator[](edge).prevOut = edge;
   344       }
   345 
   346       virtual void add(const std::vector<Edge>& edges) {
   347 	Parent::add(edges);
   348 	for (int i = 0; i < (int)edges.size(); ++i) {
   349 	  Parent::operator[](edges[i]).prevOut = edges[i];
   350 	}
   351       }
   352 
   353       virtual void erase(const Edge& edge) {
   354 	adaptor.hide(edge);
   355 	Parent::erase(edge);
   356       }
   357 
   358       virtual void erase(const std::vector<Edge>& edges) {
   359 	for (int i = 0; i < (int)edges.size(); ++i) {
   360 	  adaptor.hide(edges[i]);
   361 	}
   362 	Parent::erase(edges);
   363       }
   364 
   365     private:
   366       SubGraph& adaptor;
   367     };
   368 
   369     NodesImpl* nodes;
   370     EdgesImpl* edges;
   371     Node firstNode;
   372   };
   373 
   374   /// \ingroup semi_adaptors
   375   ///
   376   /// \brief Graph which uses a subset of another graph's nodes and edges.
   377   ///
   378   /// Graph which uses a subset of another graph's nodes and edges. This class
   379   /// is an alternative to the SubGraphAdaptor which is created for the
   380   /// same reason. The main difference between the two class that it
   381   /// makes linked lists on the unhidden nodes and edges what cause that
   382   /// on sparse subgraphs the algorithms can be more efficient and some times
   383   /// provide better time complexity. On other way this implemetation is
   384   /// less efficient in most case when the subgraph filters out only
   385   /// a few nodes or edges.
   386   /// 
   387   /// \see SubGraphAdaptor
   388   /// \see EdgeSubGraphBase
   389   template <typename Graph>
   390   class SubGraph 
   391     : public GraphAdaptorExtender< SubGraphBase<Graph> > {
   392   public:
   393     typedef GraphAdaptorExtender< SubGraphBase<Graph> > Parent;
   394   public:
   395     /// \brief Constructor for sub-graph.
   396     ///
   397     /// Constructor for sub-graph. Initially all the edges and nodes
   398     /// are hidden in the graph.
   399     SubGraph(const Graph& _graph) 
   400       : Parent(), nodes(*this, _graph), edges(*this, _graph) { 
   401       Parent::construct(_graph, nodes, edges);
   402     }
   403   private:
   404     typename Parent::NodesImpl nodes;
   405     typename Parent::EdgesImpl edges;
   406   };
   407 
   408   /// \brief Base for the EdgeSubGraph.
   409   ///
   410   /// Base for the EdgeSubGraph.
   411   template <typename _Graph>
   412   class EdgeSubGraphBase : public GraphAdaptorBase<const _Graph> {
   413   public:
   414     typedef _Graph Graph;
   415     typedef EdgeSubGraphBase<_Graph> SubGraph;
   416     typedef GraphAdaptorBase<const _Graph> Parent;
   417     typedef Parent Base;
   418 
   419     typedef typename Parent::Node Node;
   420     typedef typename Parent::Edge Edge;
   421 
   422 
   423   protected:
   424 
   425     class NodesImpl;
   426     class EdgesImpl;
   427 
   428     EdgeSubGraphBase() {}
   429 
   430     void construct(const Graph& _graph, NodesImpl& _nodes, EdgesImpl& _edges) {
   431       Parent::setGraph(_graph);
   432       nodes = &_nodes;
   433       edges = &_edges;
   434 
   435       Node node;
   436       Parent::first(node);
   437       while (node != INVALID) {
   438 	(*nodes)[node].firstIn = INVALID;
   439 	(*nodes)[node].firstOut = INVALID;
   440 	Parent::next(node);
   441       }
   442 
   443       Edge edge;
   444       Parent::first(edge);
   445       while (edge != INVALID) {
   446 	(*edges)[edge].prevOut = edge;
   447 	Parent::next(edge);
   448       }
   449     }
   450 
   451   public:
   452 
   453     void first(Node& node) const {
   454       Parent::first(node);
   455     }
   456     void next(Node& node) const {
   457       Parent::next(node);
   458     }
   459 
   460     void first(Edge& edge) const {
   461       Node node;
   462       Parent::first(node);
   463       while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
   464 	Parent::next(node);
   465       }
   466       if (node == INVALID) {
   467 	edge = INVALID;
   468       } else {
   469 	edge = (*nodes)[node].firstOut;
   470       }
   471     }
   472     void next(Edge& edge) const {
   473       if ((*edges)[edge].nextOut != INVALID) {
   474 	edge = (*edges)[edge].nextOut;
   475       } else {
   476 	Node node = source(edge);
   477 	Parent::next(node);
   478 	while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
   479 	  Parent::next(node);
   480 	}
   481 	if (node == INVALID) {
   482 	  edge = INVALID;
   483 	} else {
   484 	  edge = (*nodes)[node].firstOut;
   485 	}
   486       }
   487     }
   488 
   489     void firstOut(Edge& edge, const Node& node) const {
   490       edge = (*nodes)[node].firstOut;
   491     }
   492     void nextOut(Edge& edge) const {
   493       edge = (*edges)[edge].nextOut;
   494     }
   495 
   496     void firstIn(Edge& edge, const Node& node) const {
   497       edge = (*nodes)[node].firstIn;
   498     }
   499     void nextIn(Edge& edge) const {
   500       edge = (*edges)[edge].nextIn;
   501     }
   502 
   503     /// \brief Returns true when the given edge is hidden.
   504     ///
   505     /// Returns true when the given edge is hidden.
   506     bool hidden(const Edge& edge) const {
   507       return (*edges)[edge].prevOut == edge;
   508     }
   509 
   510     /// \brief Hide the given edge in the sub-graph.
   511     ///
   512     /// Hide the given edge in the sub graph. It just lace out from
   513     /// the linked lists the given edge.
   514     void hide(const Edge& edge) {
   515       if (hidden(edge)) return;
   516       if ((*edges)[edge].prevOut != INVALID) {
   517 	(*edges)[(*edges)[edge].prevOut].nextOut = (*edges)[edge].nextOut;
   518       } else {
   519 	(*nodes)[source(edge)].firstOut = (*edges)[edge].nextOut;
   520       }
   521       if ((*edges)[edge].nextOut != INVALID) {
   522 	(*edges)[(*edges)[edge].nextOut].prevOut = (*edges)[edge].prevOut;
   523       }
   524 
   525       if ((*edges)[edge].prevIn != INVALID) {
   526 	(*edges)[(*edges)[edge].prevIn].nextIn = (*edges)[edge].nextIn;
   527       } else {
   528 	(*nodes)[target(edge)].firstIn = (*edges)[edge].nextIn;
   529       }
   530       if ((*edges)[edge].nextIn != INVALID) {
   531 	(*edges)[(*edges)[edge].nextIn].prevIn = (*edges)[edge].prevIn;
   532       }
   533       (*edges)[edge].prevOut = edge;
   534     }
   535 
   536     /// \brief Unhide the given edge in the sub-graph.
   537     ///
   538     /// Unhide the given edge in the sub graph. It just lace in the given
   539     /// edge into the linked lists.
   540     void unHide(const Edge& edge) {
   541       if (!hidden(edge)) return;
   542       Node node;
   543 
   544       node = Parent::source(edge);
   545       (*edges)[edge].nextOut = (*nodes)[node].firstOut;
   546       (*edges)[edge].prevOut = INVALID;
   547       if ((*edges)[edge].nextOut != INVALID) {
   548 	(*edges)[(*edges)[edge].nextOut].prevOut = edge;
   549       }
   550       (*nodes)[node].firstOut = edge;
   551 
   552       node = Parent::target(edge);
   553       (*edges)[edge].nextIn = (*nodes)[node].firstIn;
   554       (*edges)[edge].prevIn = INVALID;
   555       if ((*edges)[edge].nextIn != INVALID) {
   556 	(*edges)[(*edges)[edge].nextIn].prevIn = edge;
   557       }
   558       (*nodes)[node].firstIn = edge;      
   559     }
   560     
   561   protected:
   562     struct NodeT {
   563       Edge firstIn, firstOut;
   564     };
   565     class NodesImpl : public DefaultMap<Graph, Node, NodeT> {
   566       friend class EdgeSubGraphBase;
   567     public:
   568       typedef DefaultMap<Graph, Node, NodeT> Parent;
   569 
   570       NodesImpl(SubGraph& _adaptor, const Graph& _graph) 
   571 	: Parent(_graph), adaptor(_adaptor) {}
   572 
   573       virtual ~NodesImpl() {}
   574 
   575       virtual void build() {
   576 	Parent::build();
   577 	Node node;
   578 	adaptor.Base::first(node);
   579 	while (node != INVALID) {
   580 	  Parent::operator[](node).firstIn = INVALID;
   581 	  Parent::operator[](node).firstOut = INVALID;
   582 	  adaptor.Base::next(node);
   583 	}
   584       }
   585 
   586       virtual void add(const Node& node) {
   587 	Parent::add(node);
   588 	Parent::operator[](node).firstIn = INVALID;
   589 	Parent::operator[](node).firstOut = INVALID;
   590       }
   591 
   592       virtual void add(const std::vector<Node>& nodes) {
   593         Parent::add(nodes);
   594         for (int i = 0; i < (int)nodes.size(); ++i) {
   595           Parent::operator[](nodes[i]).firstIn = INVALID;
   596           Parent::operator[](nodes[i]).firstOut = INVALID;
   597         }
   598       }
   599 
   600     private:
   601       SubGraph& adaptor;
   602     };
   603 
   604     struct EdgeT {
   605       Edge prevOut, nextOut;
   606       Edge prevIn, nextIn;
   607     };
   608     class EdgesImpl : public DefaultMap<Graph, Edge, EdgeT> {
   609       friend class EdgeSubGraphBase;
   610     public:
   611       typedef DefaultMap<Graph, Edge, EdgeT> Parent;
   612 
   613       EdgesImpl(SubGraph& _adaptor, const Graph& _graph) 
   614 	: Parent(_graph), adaptor(_adaptor) {}
   615 
   616       virtual ~EdgesImpl() {}
   617 
   618       virtual void build() {
   619 	Parent::build();
   620 	Edge edge;
   621 	adaptor.Base::first(edge);
   622 	while (edge != INVALID) {
   623 	  Parent::operator[](edge).prevOut = edge;
   624 	  adaptor.Base::next(edge);
   625 	}
   626       }
   627 
   628       virtual void clear() {
   629 	Node node;
   630 	adaptor.Base::first(node);
   631 	while (node != INVALID) {
   632 	  (*adaptor.nodes)[node].firstIn = INVALID;
   633 	  (*adaptor.nodes)[node].firstOut = INVALID;
   634 	  adaptor.Base::next(node);
   635 	}
   636 	Parent::clear();
   637       }
   638 
   639       virtual void add(const Edge& edge) {
   640 	Parent::add(edge);
   641 	Parent::operator[](edge).prevOut = edge;
   642       }
   643 
   644       virtual void add(const std::vector<Edge>& edges) {
   645 	Parent::add(edges);
   646 	for (int i = 0; i < (int)edges.size(); ++i) {
   647 	  Parent::operator[](edges[i]).prevOut = edges[i];
   648 	}
   649       }
   650 
   651       virtual void erase(const Edge& edge) {
   652 	adaptor.hide(edge);
   653 	Parent::erase(edge);
   654       }
   655 
   656       virtual void erase(const std::vector<Edge>& edges) {
   657 	for (int i = 0; i < (int)edges.size(); ++i) {
   658 	  adaptor.hide(edges[i]);
   659 	}
   660 	Parent::erase(edges);
   661       }
   662 
   663     private:
   664       SubGraph& adaptor;
   665     };
   666 
   667     NodesImpl* nodes;
   668     EdgesImpl* edges;
   669   };
   670 
   671   /// \ingroup semi_adaptors
   672   ///
   673   /// \brief Graph which uses a subset of another graph's edges.
   674   ///
   675   /// Graph which uses a subset of another graph's edges. This class
   676   /// is an alternative to the EdgeSubGraphAdaptor which is created for the
   677   /// same reason. The main difference between the two class that it
   678   /// makes linked lists on the unhidden edges what cause that
   679   /// on sparse subgraphs the algorithms can be more efficient and some times
   680   /// provide better time complexity. On other way this implemetation is
   681   /// less efficient in most case when the subgraph filters out only
   682   /// a few edges.
   683   /// 
   684   /// \see EdgeSubGraphAdaptor
   685   /// \see EdgeSubGraphBase
   686   template <typename Graph>
   687   class EdgeSubGraph 
   688     : public GraphAdaptorExtender< EdgeSubGraphBase<Graph> > {
   689   public:
   690     typedef GraphAdaptorExtender< EdgeSubGraphBase<Graph> > Parent;
   691   public:
   692     /// \brief Constructor for sub-graph.
   693     ///
   694     /// Constructor for sub-graph. Initially all the edges are hidden in the 
   695     /// graph.
   696     EdgeSubGraph(const Graph& _graph) 
   697       : Parent(), nodes(*this, _graph), edges(*this, _graph) { 
   698       Parent::construct(_graph, nodes, edges);
   699     }
   700   private:
   701     typename Parent::NodesImpl nodes;
   702     typename Parent::EdgesImpl edges;
   703   };
   704 
   705 
   706 //   template<typename Graph, typename Number, 
   707 // 	   typename CapacityMap, typename FlowMap>
   708 //   class ResGraph
   709 //     : public IterableGraphExtender<EdgeSubGraphBase<
   710 //     UGraphAdaptor<Graph> > > {
   711 //   public:
   712 //     typedef IterableGraphExtender<EdgeSubGraphBase<
   713 //       UGraphAdaptor<Graph> > > Parent;
   714 
   715 //   protected:
   716 //     UGraphAdaptor<Graph> u;
   717 
   718 //     const CapacityMap* capacity;
   719 //     FlowMap* flow;
   720 
   721 //     typename Parent::NodesImpl nodes;
   722 //     typename Parent::EdgesImpl edges;
   723 
   724 //     void setCapacityMap(const CapacityMap& _capacity) {
   725 //       capacity=&_capacity;
   726 //     }
   727 
   728 //     void setFlowMap(FlowMap& _flow) {
   729 //       flow=&_flow;
   730 //     }
   731 
   732 //   public:
   733 
   734 //     typedef typename UGraphAdaptor<Graph>::Node Node;
   735 //     typedef typename UGraphAdaptor<Graph>::Edge Edge;
   736 //     typedef typename UGraphAdaptor<Graph>::UEdge UEdge;
   737 
   738 //     ResGraphAdaptor(Graph& _graph, 
   739 // 		    const CapacityMap& _capacity, FlowMap& _flow) 
   740 //       : Parent(), u(_graph), capacity(&_capacity), flow(&_flow),
   741 // 	nodes(*this, _graph), edges(*this, _graph) {
   742 //       Parent::construct(u, nodes, edges);
   743 //       setFlowMap(_flow);
   744 //       setCapacityMap(_capacity);
   745 //       typename Graph::Edge edge; 
   746 //       for (_graph.first(edge); edge != INVALID; _graph.next(edge)) {
   747 // 	if ((*flow)[edge] != (*capacity)[edge]) {
   748 // 	  Parent::unHide(direct(edge, true));
   749 // 	}
   750 // 	if ((*flow)[edge] != 0) {
   751 // 	  Parent::unHide(direct(edge, false));
   752 // 	}
   753 //       }
   754 //     }
   755 
   756 //     void augment(const Edge& e, Number a) {
   757 //       if (direction(e)) {
   758 // 	flow->set(e, (*flow)[e]+a);
   759 //       } else { 
   760 // 	flow->set(e, (*flow)[e]-a);
   761 //       }
   762 //       if ((*flow)[e] == (*capacity)[e]) {
   763 // 	Parent::hide(e);
   764 //       } else {
   765 // 	Parent::unHide(e);
   766 //       }
   767 //       if ((*flow)[e] == 0) {
   768 // 	Parent::hide(oppositeEdge(e));
   769 //       } else {
   770 // 	Parent::unHide(oppositeEdge(e));
   771 //       }
   772 //     }
   773 
   774 //     Number resCap(const Edge& e) {
   775 //       if (direction(e)) { 
   776 // 	return (*capacity)[e]-(*flow)[e]; 
   777 //       } else { 
   778 // 	return (*flow)[e];
   779 //       }
   780 //     }
   781     
   782 //     bool direction(const Edge& edge) const {
   783 //       return Parent::getGraph().direction(edge);
   784 //     }
   785 
   786 //     Edge direct(const UEdge& edge, bool direction) const {
   787 //       return Parent::getGraph().direct(edge, direction);
   788 //     }
   789 
   790 //     Edge direct(const UEdge& edge, const Node& node) const {
   791 //       return Parent::getGraph().direct(edge, node);
   792 //     }
   793 
   794 //     Edge oppositeEdge(const Edge& edge) const {
   795 //       return Parent::getGraph().oppositeEdge(edge);
   796 //     }
   797 
   798 //     /// \brief Residual capacity map.
   799 //     ///
   800 //     /// In generic residual graphs the residual capacity can be obtained 
   801 //     /// as a map. 
   802 //     class ResCap {
   803 //     protected:
   804 //       const ResGraphAdaptor* res_graph;
   805 //     public:
   806 //       typedef Number Value;
   807 //       typedef Edge Key;
   808 //       ResCap(const ResGraphAdaptor& _res_graph) 
   809 // 	: res_graph(&_res_graph) {}
   810 //       Number operator[](const Edge& e) const {
   811 // 	return res_graph->resCap(e);
   812 //       }
   813 //     };
   814 //   };
   815 
   816 }
   817 
   818 #endif