lemon/digraph_adaptor.h
changeset 415 4b6112235fad
parent 414 05357da973ce
equal deleted inserted replaced
0:de59e1076a9d 1:e9b3d914b40d
    21 
    21 
    22 ///\ingroup graph_adaptors
    22 ///\ingroup graph_adaptors
    23 ///\file
    23 ///\file
    24 ///\brief Several digraph adaptors.
    24 ///\brief Several digraph adaptors.
    25 ///
    25 ///
    26 ///This file contains several useful digraph adaptor functions.
    26 ///This file contains several useful digraph adaptor classes.
    27 
    27 
    28 #include <lemon/core.h>
    28 #include <lemon/core.h>
    29 #include <lemon/maps.h>
    29 #include <lemon/maps.h>
    30 #include <lemon/bits/variant.h>
    30 #include <lemon/bits/variant.h>
    31 
    31 
    36 
    36 
    37 #include <algorithm>
    37 #include <algorithm>
    38 
    38 
    39 namespace lemon {
    39 namespace lemon {
    40 
    40 
    41   ///\brief Base type for the Digraph Adaptors
       
    42   ///
       
    43   ///Base type for the Digraph Adaptors
       
    44   ///
       
    45   ///This is the base type for most of LEMON digraph adaptors. This
       
    46   ///class implements a trivial digraph adaptor i.e. it only wraps the
       
    47   ///functions and types of the digraph. The purpose of this class is
       
    48   ///to make easier implementing digraph adaptors. E.g. if an adaptor
       
    49   ///is considered which differs from the wrapped digraph only in some
       
    50   ///of its functions or types, then it can be derived from
       
    51   ///DigraphAdaptor, and only the differences should be implemented.
       
    52   template<typename _Digraph>
    41   template<typename _Digraph>
    53   class DigraphAdaptorBase {
    42   class DigraphAdaptorBase {
    54   public:
    43   public:
    55     typedef _Digraph Digraph;
    44     typedef _Digraph Digraph;
    56     typedef DigraphAdaptorBase Adaptor;
    45     typedef DigraphAdaptorBase Adaptor;
   164 
   153 
   165     };
   154     };
   166 
   155 
   167   };
   156   };
   168 
   157 
   169   ///\ingroup graph_adaptors
       
   170   ///
       
   171   ///\brief Trivial Digraph Adaptor
       
   172   /// 
       
   173   /// This class is an adaptor which does not change the adapted
       
   174   /// digraph.  It can be used only to test the digraph adaptors.
       
   175   template <typename _Digraph>
       
   176   class DigraphAdaptor :
       
   177     public DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > { 
       
   178   public:
       
   179     typedef _Digraph Digraph;
       
   180     typedef DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > Parent;
       
   181   protected:
       
   182     DigraphAdaptor() : Parent() { }
       
   183 
       
   184   public:
       
   185     explicit DigraphAdaptor(Digraph& digraph) { setDigraph(digraph); }
       
   186   };
       
   187 
       
   188   /// \brief Just gives back a digraph adaptor
       
   189   ///
       
   190   /// Just gives back a digraph adaptor which 
       
   191   /// should be provide original digraph
       
   192   template<typename Digraph>
       
   193   DigraphAdaptor<const Digraph>
       
   194   digraphAdaptor(const Digraph& digraph) {
       
   195     return DigraphAdaptor<const Digraph>(digraph);
       
   196   }
       
   197 
       
   198 
   158 
   199   template <typename _Digraph>
   159   template <typename _Digraph>
   200   class RevDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> {
   160   class RevDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> {
   201   public:
   161   public:
   202     typedef _Digraph Digraph;
   162     typedef _Digraph Digraph;
   229   ///
   189   ///
   230   ///\brief A digraph adaptor which reverses the orientation of the arcs.
   190   ///\brief A digraph adaptor which reverses the orientation of the arcs.
   231   ///
   191   ///
   232   /// If \c g is defined as
   192   /// If \c g is defined as
   233   ///\code
   193   ///\code
   234   /// ListDigraph g;
   194   /// ListDigraph dg;
   235   ///\endcode
   195   ///\endcode
   236   /// then
   196   /// then
   237   ///\code
   197   ///\code
   238   /// RevDigraphAdaptor<ListDigraph> ga(g);
   198   /// RevDigraphAdaptor<ListDigraph> dga(dg);
   239   ///\endcode
   199   ///\endcode
   240   /// implements the digraph obtained from \c g by 
   200   /// implements the digraph obtained from \c dg by 
   241   /// reversing the orientation of its arcs.
   201   /// reversing the orientation of its arcs.
   242   ///
   202   ///
   243   /// A good example of using RevDigraphAdaptor is to decide that the
   203   /// A good example of using RevDigraphAdaptor is to decide whether
   244   /// directed graph is wheter strongly connected or not. If from one
   204   /// the directed graph is strongly connected or not. The digraph is
   245   /// node each node is reachable and from each node is reachable this
   205   /// strongly connected iff each node is reachable from one node and
   246   /// node then and just then the digraph is strongly
   206   /// this node is reachable from the others. Instead of this
   247   /// connected. Instead of this condition we use a little bit
   207   /// condition we use a slightly different, from one node each node
   248   /// different. From one node each node ahould be reachable in the
   208   /// is reachable both in the digraph and the reversed digraph. Now
   249   /// digraph and in the reversed digraph. Now this condition can be
   209   /// this condition can be checked with the Dfs algorithm and the
   250   /// checked with the Dfs algorithm class and the RevDigraphAdaptor
   210   /// RevDigraphAdaptor class.
   251   /// algorithm class.
   211   ///
   252   ///
   212   /// The implementation:
   253   /// And look at the code:
       
   254   ///
       
   255   ///\code
   213   ///\code
   256   /// bool stronglyConnected(const Digraph& digraph) {
   214   /// bool stronglyConnected(const Digraph& digraph) {
   257   ///   if (NodeIt(digraph) == INVALID) return true;
   215   ///   if (NodeIt(digraph) == INVALID) return true;
   258   ///   Dfs<Digraph> dfs(digraph);
   216   ///   Dfs<Digraph> dfs(digraph);
   259   ///   dfs.run(NodeIt(digraph));
   217   ///   dfs.run(NodeIt(digraph));
   282     typedef DigraphAdaptorExtender<
   240     typedef DigraphAdaptorExtender<
   283       RevDigraphAdaptorBase<_Digraph> > Parent;
   241       RevDigraphAdaptorBase<_Digraph> > Parent;
   284   protected:
   242   protected:
   285     RevDigraphAdaptor() { }
   243     RevDigraphAdaptor() { }
   286   public:
   244   public:
       
   245 
       
   246     /// \brief Constructor
       
   247     ///
       
   248     /// Creates a reverse graph adaptor for the given digraph
   287     explicit RevDigraphAdaptor(Digraph& digraph) { 
   249     explicit RevDigraphAdaptor(Digraph& digraph) { 
   288       Parent::setDigraph(digraph); 
   250       Parent::setDigraph(digraph); 
   289     }
   251     }
   290   };
   252   };
   291 
   253 
   372       Parent::nextOut(i); 
   334       Parent::nextOut(i); 
   373       while (i != INVALID && (!(*_arc_filter)[i] 
   335       while (i != INVALID && (!(*_arc_filter)[i] 
   374 	     || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i); 
   336 	     || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i); 
   375     }
   337     }
   376 
   338 
   377     ///\e
       
   378 
       
   379     /// This function hides \c n in the digraph, i.e. the iteration 
       
   380     /// jumps over it. This is done by simply setting the value of \c n  
       
   381     /// to be false in the corresponding node-map.
       
   382     void hide(const Node& n) const { _node_filter->set(n, false); }
   339     void hide(const Node& n) const { _node_filter->set(n, false); }
   383 
       
   384     ///\e
       
   385 
       
   386     /// This function hides \c a in the digraph, i.e. the iteration 
       
   387     /// jumps over it. This is done by simply setting the value of \c a
       
   388     /// to be false in the corresponding arc-map.
       
   389     void hide(const Arc& a) const { _arc_filter->set(a, false); }
   340     void hide(const Arc& a) const { _arc_filter->set(a, false); }
   390 
   341 
   391     ///\e
   342     void unHide(const Node& n) const { _node_filter->set(n, true); }
   392 
       
   393     /// The value of \c n is set to be true in the node-map which stores 
       
   394     /// hide information. If \c n was hidden previuosly, then it is shown 
       
   395     /// again
       
   396      void unHide(const Node& n) const { _node_filter->set(n, true); }
       
   397 
       
   398     ///\e
       
   399 
       
   400     /// The value of \c a is set to be true in the arc-map which stores 
       
   401     /// hide information. If \c a was hidden previuosly, then it is shown 
       
   402     /// again
       
   403     void unHide(const Arc& a) const { _arc_filter->set(a, true); }
   343     void unHide(const Arc& a) const { _arc_filter->set(a, true); }
   404 
   344 
   405     /// Returns true if \c n is hidden.
       
   406     
       
   407     ///\e
       
   408     ///
       
   409     bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
   345     bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
   410 
       
   411     /// Returns true if \c a is hidden.
       
   412     
       
   413     ///\e
       
   414     ///
       
   415     bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; }
   346     bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; }
   416 
   347 
   417     typedef False NodeNumTag;
   348     typedef False NodeNumTag;
   418     typedef False EdgeNumTag;
   349     typedef False EdgeNumTag;
   419 
   350 
   546     void nextOut(Arc& i) const { 
   477     void nextOut(Arc& i) const { 
   547       Parent::nextOut(i); 
   478       Parent::nextOut(i); 
   548       while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); 
   479       while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); 
   549     }
   480     }
   550 
   481 
   551     ///\e
       
   552 
       
   553     /// This function hides \c n in the digraph, i.e. the iteration 
       
   554     /// jumps over it. This is done by simply setting the value of \c n  
       
   555     /// to be false in the corresponding node-map.
       
   556     void hide(const Node& n) const { _node_filter->set(n, false); }
   482     void hide(const Node& n) const { _node_filter->set(n, false); }
   557 
       
   558     ///\e
       
   559 
       
   560     /// This function hides \c e in the digraph, i.e. the iteration 
       
   561     /// jumps over it. This is done by simply setting the value of \c e  
       
   562     /// to be false in the corresponding arc-map.
       
   563     void hide(const Arc& e) const { _arc_filter->set(e, false); }
   483     void hide(const Arc& e) const { _arc_filter->set(e, false); }
   564 
   484 
   565     ///\e
   485     void unHide(const Node& n) const { _node_filter->set(n, true); }
   566 
       
   567     /// The value of \c n is set to be true in the node-map which stores 
       
   568     /// hide information. If \c n was hidden previuosly, then it is shown 
       
   569     /// again
       
   570      void unHide(const Node& n) const { _node_filter->set(n, true); }
       
   571 
       
   572     ///\e
       
   573 
       
   574     /// The value of \c e is set to be true in the arc-map which stores 
       
   575     /// hide information. If \c e was hidden previuosly, then it is shown 
       
   576     /// again
       
   577     void unHide(const Arc& e) const { _arc_filter->set(e, true); }
   486     void unHide(const Arc& e) const { _arc_filter->set(e, true); }
   578 
   487 
   579     /// Returns true if \c n is hidden.
       
   580     
       
   581     ///\e
       
   582     ///
       
   583     bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
   488     bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
   584 
       
   585     /// Returns true if \c n is hidden.
       
   586     
       
   587     ///\e
       
   588     ///
       
   589     bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; }
   489     bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; }
   590 
   490 
   591     typedef False NodeNumTag;
   491     typedef False NodeNumTag;
   592     typedef False EdgeNumTag;
   492     typedef False EdgeNumTag;
   593 
   493 
   659   /// \ingroup graph_adaptors
   559   /// \ingroup graph_adaptors
   660   ///
   560   ///
   661   /// \brief A digraph adaptor for hiding nodes and arcs from a digraph.
   561   /// \brief A digraph adaptor for hiding nodes and arcs from a digraph.
   662   /// 
   562   /// 
   663   /// SubDigraphAdaptor shows the digraph with filtered node-set and 
   563   /// SubDigraphAdaptor shows the digraph with filtered node-set and 
   664   /// arc-set. If the \c checked parameter is true then it filters the arcset
   564   /// arc-set. If the \c checked parameter is true then it filters the arc-set
   665   /// to do not get invalid arcs without source or target.
   565   /// respect to the source and target.
   666   /// Let \f$ G=(V, A) \f$ be a directed digraph
       
   667   /// and suppose that the digraph instance \c g of type ListDigraph
       
   668   /// implements \f$ G \f$.
       
   669   /// Let moreover \f$ b_V \f$ and \f$ b_A \f$ be bool-valued functions resp.
       
   670   /// on the node-set and arc-set.
       
   671   /// SubDigraphAdaptor<...>::NodeIt iterates 
       
   672   /// on the node-set \f$ \{v\in V : b_V(v)=true\} \f$ and 
       
   673   /// SubDigraphAdaptor<...>::ArcIt iterates 
       
   674   /// on the arc-set \f$ \{e\in A : b_A(e)=true\} \f$. Similarly, 
       
   675   /// SubDigraphAdaptor<...>::OutArcIt and
       
   676   /// SubDigraphAdaptor<...>::InArcIt iterates 
       
   677   /// only on arcs leaving and entering a specific node which have true value.
       
   678   /// 
   566   /// 
   679   /// If the \c checked template parameter is false then we have to
   567   /// If the \c checked template parameter is false then the
   680   /// note that the node-iterator cares only the filter on the
   568   /// node-iterator cares only the filter on the node-set, and the
   681   /// node-set, and the arc-iterator cares only the filter on the
   569   /// arc-iterator cares only the filter on the arc-set.  Therefore
   682   /// arc-set.  This way the arc-map should filter all arcs which's
   570   /// the arc-map have to filter all arcs which's source or target is
   683   /// source or target is filtered by the node-filter.
   571   /// filtered by the node-filter.
   684   ///\code
   572   ///\code
   685   /// typedef ListDigraph Digraph;
   573   /// typedef ListDigraph Digraph;
   686   /// DIGRAPH_TYPEDEFS(Digraph);
   574   /// DIGRAPH_TYPEDEFS(Digraph);
   687   /// Digraph g;
   575   /// Digraph g;
   688   /// Node u=g.addNode(); //node of id 0
   576   /// Node u=g.addNode(); //node of id 0
   691   /// Arc f=g.addArc(v, u); //arc of id 1
   579   /// Arc f=g.addArc(v, u); //arc of id 1
   692   /// BoolNodeMap nm(g, true);
   580   /// BoolNodeMap nm(g, true);
   693   /// nm.set(u, false);
   581   /// nm.set(u, false);
   694   /// BoolArcMap am(g, true);
   582   /// BoolArcMap am(g, true);
   695   /// am.set(a, false);
   583   /// am.set(a, false);
   696   /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubGA;
   584   /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubDGA;
   697   /// SubGA ga(g, nm, am);
   585   /// SubDGA ga(g, nm, am);
   698   /// for (SubGA::NodeIt n(ga); n!=INVALID; ++n)
   586   /// for (SubDGA::NodeIt n(ga); n!=INVALID; ++n)
   699   ///   std::cout << g.id(n) << std::endl;
   587   ///   std::cout << g.id(n) << std::endl;
   700   /// std::cout << ":-)" << std::endl;
   588   /// for (SubDGA::ArcIt a(ga); a!=INVALID; ++a) 
   701   /// for (SubGA::ArcIt a(ga); a!=INVALID; ++a) 
       
   702   ///   std::cout << g.id(a) << std::endl;
   589   ///   std::cout << g.id(a) << std::endl;
   703   ///\endcode
   590   ///\endcode
   704   /// The output of the above code is the following.
   591   /// The output of the above code is the following.
   705   ///\code
   592   ///\code
   706   /// 1
   593   /// 1
   707   /// :-)
       
   708   /// 1
   594   /// 1
   709   ///\endcode
   595   ///\endcode
   710   /// Note that \c n is of type \c SubGA::NodeIt, but it can be converted to
   596   /// Note that \c n is of type \c SubDGA::NodeIt, but it can be converted to
   711   /// \c Digraph::Node that is why \c g.id(n) can be applied.
   597   /// \c Digraph::Node that is why \c g.id(n) can be applied.
   712   /// 
   598   /// 
   713   /// For other examples see also the documentation of
   599   /// For other examples see also the documentation of
   714   /// NodeSubDigraphAdaptor and ArcSubDigraphAdaptor.
   600   /// NodeSubDigraphAdaptor and ArcSubDigraphAdaptor.
   715   template<typename _Digraph, 
   601   template<typename _Digraph, 
   726 
   612 
   727     typedef DigraphAdaptorExtender<
   613     typedef DigraphAdaptorExtender<
   728       SubDigraphAdaptorBase<Digraph, NodeFilterMap, ArcFilterMap, checked> >
   614       SubDigraphAdaptorBase<Digraph, NodeFilterMap, ArcFilterMap, checked> >
   729     Parent;
   615     Parent;
   730 
   616 
       
   617     typedef typename Parent::Node Node;
       
   618     typedef typename Parent::Arc Arc;
       
   619 
   731   protected:
   620   protected:
   732     SubDigraphAdaptor() { }
   621     SubDigraphAdaptor() { }
   733   public:
   622   public:
   734 
   623 
       
   624     /// \brief Constructor
       
   625     ///
       
   626     /// Creates a sub-digraph-adaptor for the given digraph with
       
   627     /// given node and arc map filters.
   735     SubDigraphAdaptor(Digraph& digraph, NodeFilterMap& node_filter, 
   628     SubDigraphAdaptor(Digraph& digraph, NodeFilterMap& node_filter, 
   736 		      ArcFilterMap& arc_filter) { 
   629 		      ArcFilterMap& arc_filter) { 
   737       setDigraph(digraph);
   630       setDigraph(digraph);
   738       setNodeFilterMap(node_filter);
   631       setNodeFilterMap(node_filter);
   739       setArcFilterMap(arc_filter);
   632       setArcFilterMap(arc_filter);
   740     }
   633     }
   741 
   634 
       
   635     /// \brief Hides the node of the graph
       
   636     ///
       
   637     /// This function hides \c n in the digraph, i.e. the iteration 
       
   638     /// jumps over it. This is done by simply setting the value of \c n  
       
   639     /// to be false in the corresponding node-map.
       
   640     void hide(const Node& n) const { Parent::hide(n); }
       
   641 
       
   642     /// \brief Hides the arc of the graph
       
   643     ///
       
   644     /// This function hides \c a in the digraph, i.e. the iteration 
       
   645     /// jumps over it. This is done by simply setting the value of \c a
       
   646     /// to be false in the corresponding arc-map.
       
   647     void hide(const Arc& a) const { Parent::hide(a); }
       
   648 
       
   649     /// \brief Unhides the node of the graph
       
   650     ///
       
   651     /// The value of \c n is set to be true in the node-map which stores 
       
   652     /// hide information. If \c n was hidden previuosly, then it is shown 
       
   653     /// again
       
   654     void unHide(const Node& n) const { Parent::unHide(n); }
       
   655 
       
   656     /// \brief Unhides the arc of the graph
       
   657     ///
       
   658     /// The value of \c a is set to be true in the arc-map which stores 
       
   659     /// hide information. If \c a was hidden previuosly, then it is shown 
       
   660     /// again
       
   661     void unHide(const Arc& a) const { Parent::unHide(a); }
       
   662 
       
   663     /// \brief Returns true if \c n is hidden.
       
   664     ///
       
   665     /// Returns true if \c n is hidden.
       
   666     ///
       
   667     bool hidden(const Node& n) const { return Parent::hidden(n); }
       
   668 
       
   669     /// \brief Returns true if \c a is hidden.
       
   670     ///
       
   671     /// Returns true if \c a is hidden.
       
   672     ///
       
   673     bool hidden(const Arc& a) const { return Parent::hidden(a); }
       
   674 
   742   };
   675   };
   743 
   676 
   744   /// \brief Just gives back a sub digraph adaptor
   677   /// \brief Just gives back a sub-digraph-adaptor
   745   ///
   678   ///
   746   /// Just gives back a sub digraph adaptor
   679   /// Just gives back a sub-digraph-adaptor
   747   template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
   680   template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
   748   SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
   681   SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
   749   subDigraphAdaptor(const Digraph& digraph, 
   682   subDigraphAdaptor(const Digraph& digraph, 
   750 		    NodeFilterMap& nfm, ArcFilterMap& afm) {
   683 		    NodeFilterMap& nfm, ArcFilterMap& afm) {
   751     return SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
   684     return SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
   772   SubDigraphAdaptor<const Digraph, const NodeFilterMap, const ArcFilterMap>
   705   SubDigraphAdaptor<const Digraph, const NodeFilterMap, const ArcFilterMap>
   773   subDigraphAdaptor(const Digraph& digraph, 
   706   subDigraphAdaptor(const Digraph& digraph, 
   774                    NodeFilterMap& nfm, ArcFilterMap& afm) {
   707                    NodeFilterMap& nfm, ArcFilterMap& afm) {
   775     return SubDigraphAdaptor<const Digraph, const NodeFilterMap, 
   708     return SubDigraphAdaptor<const Digraph, const NodeFilterMap, 
   776       const ArcFilterMap>(digraph, nfm, afm);
   709       const ArcFilterMap>(digraph, nfm, afm);
       
   710 
   777   }
   711   }
   778 
   712 
   779 
   713 
   780 
   714 
   781   ///\ingroup graph_adaptors
   715   ///\ingroup graph_adaptors
   800 
   734 
   801     typedef SubDigraphAdaptor<Digraph, NodeFilterMap, 
   735     typedef SubDigraphAdaptor<Digraph, NodeFilterMap, 
   802 			      ConstMap<typename Digraph::Arc, bool>, checked> 
   736 			      ConstMap<typename Digraph::Arc, bool>, checked> 
   803     Parent;
   737     Parent;
   804 
   738 
       
   739     typedef typename Parent::Node Node;
       
   740 
   805   protected:
   741   protected:
   806     ConstMap<typename Digraph::Arc, bool> const_true_map;
   742     ConstMap<typename Digraph::Arc, bool> const_true_map;
   807 
   743 
   808     NodeSubDigraphAdaptor() : const_true_map(true) {
   744     NodeSubDigraphAdaptor() : const_true_map(true) {
   809       Parent::setArcFilterMap(const_true_map);
   745       Parent::setArcFilterMap(const_true_map);
   810     }
   746     }
   811 
   747 
   812   public:
   748   public:
   813 
   749 
       
   750     /// \brief Constructor
       
   751     ///
       
   752     /// Creates a node-sub-digraph-adaptor for the given digraph with
       
   753     /// given node map filter.
   814     NodeSubDigraphAdaptor(Digraph& _digraph, NodeFilterMap& node_filter) : 
   754     NodeSubDigraphAdaptor(Digraph& _digraph, NodeFilterMap& node_filter) : 
   815       Parent(), const_true_map(true) { 
   755       Parent(), const_true_map(true) { 
   816       Parent::setDigraph(_digraph);
   756       Parent::setDigraph(_digraph);
   817       Parent::setNodeFilterMap(node_filter);
   757       Parent::setNodeFilterMap(node_filter);
   818       Parent::setArcFilterMap(const_true_map);
   758       Parent::setArcFilterMap(const_true_map);
   819     }
   759     }
   820 
   760 
       
   761     /// \brief Hides the node of the graph
       
   762     ///
       
   763     /// This function hides \c n in the digraph, i.e. the iteration 
       
   764     /// jumps over it. This is done by simply setting the value of \c n  
       
   765     /// to be false in the corresponding node-map.
       
   766     void hide(const Node& n) const { Parent::hide(n); }
       
   767 
       
   768     /// \brief Unhides the node of the graph
       
   769     ///
       
   770     /// The value of \c n is set to be true in the node-map which stores 
       
   771     /// hide information. If \c n was hidden previuosly, then it is shown 
       
   772     /// again
       
   773     void unHide(const Node& n) const { Parent::unHide(n); }
       
   774 
       
   775     /// \brief Returns true if \c n is hidden.
       
   776     ///
       
   777     /// Returns true if \c n is hidden.
       
   778     ///
       
   779     bool hidden(const Node& n) const { return Parent::hidden(n); }
       
   780 
   821   };
   781   };
   822 
   782 
   823 
   783 
   824   /// \brief Just gives back a \c NodeSubDigraphAdaptor
   784   /// \brief Just gives back a  node-sub-digraph adaptor
   825   ///
   785   ///
   826   /// Just gives back a \c NodeSubDigraphAdaptor
   786   /// Just gives back a node-sub-digraph adaptor
   827   template<typename Digraph, typename NodeFilterMap>
   787   template<typename Digraph, typename NodeFilterMap>
   828   NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>
   788   NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>
   829   nodeSubDigraphAdaptor(const Digraph& digraph, NodeFilterMap& nfm) {
   789   nodeSubDigraphAdaptor(const Digraph& digraph, NodeFilterMap& nfm) {
   830     return NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>(digraph, nfm);
   790     return NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>(digraph, nfm);
   831   }
   791   }
   844   ///An adaptor for hiding arcs from a digraph. This adaptor
   804   ///An adaptor for hiding arcs from a digraph. This adaptor
   845   ///specializes SubDigraphAdaptor in the way that only the arc-set
   805   ///specializes SubDigraphAdaptor in the way that only the arc-set
   846   ///can be filtered. The usefulness of this adaptor is demonstrated
   806   ///can be filtered. The usefulness of this adaptor is demonstrated
   847   ///in the problem of searching a maximum number of arc-disjoint
   807   ///in the problem of searching a maximum number of arc-disjoint
   848   ///shortest paths between two nodes \c s and \c t. Shortest here
   808   ///shortest paths between two nodes \c s and \c t. Shortest here
   849   ///means being shortest w.r.t.  non-negative arc-lengths. Note that
   809   ///means being shortest with respect to non-negative
   850   ///the comprehension of the presented solution need's some
   810   ///arc-lengths. Note that the comprehension of the presented
   851   ///elementary knowlarc from combinatorial optimization.
   811   ///solution need's some elementary knowledge from combinatorial
       
   812   ///optimization.
   852   ///
   813   ///
   853   ///If a single shortest path is to be searched between \c s and \c
   814   ///If a single shortest path is to be searched between \c s and \c
   854   ///t, then this can be done easily by applying the Dijkstra
   815   ///t, then this can be done easily by applying the Dijkstra
   855   ///algorithm. What happens, if a maximum number of arc-disjoint
   816   ///algorithm. What happens, if a maximum number of arc-disjoint
   856   ///shortest paths is to be computed. It can be proved that an arc
   817   ///shortest paths is to be computed. It can be proved that an arc
   866   ///programs, you can use \ref dim_to_dot.cc to generate .dot files
   827   ///programs, you can use \ref dim_to_dot.cc to generate .dot files
   867   ///from dimacs files.  The .dot file of the following figure was
   828   ///from dimacs files.  The .dot file of the following figure was
   868   ///generated by the demo program \ref dim_to_dot.cc.
   829   ///generated by the demo program \ref dim_to_dot.cc.
   869   ///
   830   ///
   870   ///\dot
   831   ///\dot
   871   ///didigraph lemon_dot_example {
   832   ///digraph lemon_dot_example {
   872   ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
   833   ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
   873   ///n0 [ label="0 (s)" ];
   834   ///n0 [ label="0 (s)" ];
   874   ///n1 [ label="1" ];
   835   ///n1 [ label="1" ];
   875   ///n2 [ label="2" ];
   836   ///n2 [ label="2" ];
   876   ///n3 [ label="3" ];
   837   ///n3 [ label="3" ];
   972     typedef _Digraph Digraph;
   933     typedef _Digraph Digraph;
   973     typedef _ArcFilterMap ArcFilterMap;
   934     typedef _ArcFilterMap ArcFilterMap;
   974 
   935 
   975     typedef SubDigraphAdaptor<Digraph, ConstMap<typename Digraph::Node, bool>, 
   936     typedef SubDigraphAdaptor<Digraph, ConstMap<typename Digraph::Node, bool>, 
   976 			      ArcFilterMap, false> Parent;
   937 			      ArcFilterMap, false> Parent;
       
   938 
       
   939     typedef typename Parent::Arc Arc;
       
   940 
   977   protected:
   941   protected:
   978     ConstMap<typename Digraph::Node, bool> const_true_map;
   942     ConstMap<typename Digraph::Node, bool> const_true_map;
   979 
   943 
   980     ArcSubDigraphAdaptor() : const_true_map(true) {
   944     ArcSubDigraphAdaptor() : const_true_map(true) {
   981       Parent::setNodeFilterMap(const_true_map);
   945       Parent::setNodeFilterMap(const_true_map);
   982     }
   946     }
   983 
   947 
   984   public:
   948   public:
   985 
   949 
       
   950     /// \brief Constructor
       
   951     ///
       
   952     /// Creates a arc-sub-digraph-adaptor for the given digraph with
       
   953     /// given arc map filter.
   986     ArcSubDigraphAdaptor(Digraph& digraph, ArcFilterMap& arc_filter) 
   954     ArcSubDigraphAdaptor(Digraph& digraph, ArcFilterMap& arc_filter) 
   987       : Parent(), const_true_map(true) { 
   955       : Parent(), const_true_map(true) { 
   988       Parent::setDigraph(digraph);
   956       Parent::setDigraph(digraph);
   989       Parent::setNodeFilterMap(const_true_map);
   957       Parent::setNodeFilterMap(const_true_map);
   990       Parent::setArcFilterMap(arc_filter);
   958       Parent::setArcFilterMap(arc_filter);
   991     }
   959     }
   992 
   960 
       
   961     /// \brief Hides the arc of the graph
       
   962     ///
       
   963     /// This function hides \c a in the digraph, i.e. the iteration 
       
   964     /// jumps over it. This is done by simply setting the value of \c a
       
   965     /// to be false in the corresponding arc-map.
       
   966     void hide(const Arc& a) const { Parent::hide(a); }
       
   967 
       
   968     /// \brief Unhides the arc of the graph
       
   969     ///
       
   970     /// The value of \c a is set to be true in the arc-map which stores 
       
   971     /// hide information. If \c a was hidden previuosly, then it is shown 
       
   972     /// again
       
   973     void unHide(const Arc& a) const { Parent::unHide(a); }
       
   974 
       
   975     /// \brief Returns true if \c a is hidden.
       
   976     ///
       
   977     /// Returns true if \c a is hidden.
       
   978     ///
       
   979     bool hidden(const Arc& a) const { return Parent::hidden(a); }
       
   980 
   993   };
   981   };
   994 
   982 
   995   /// \brief Just gives back an arc sub digraph adaptor
   983   /// \brief Just gives back an arc-sub-digraph adaptor
   996   ///
   984   ///
   997   /// Just gives back an arc sub digraph adaptor
   985   /// Just gives back an arc-sub-digraph adaptor
   998   template<typename Digraph, typename ArcFilterMap>
   986   template<typename Digraph, typename ArcFilterMap>
   999   ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>
   987   ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>
  1000   arcSubDigraphAdaptor(const Digraph& digraph, ArcFilterMap& afm) {
   988   arcSubDigraphAdaptor(const Digraph& digraph, ArcFilterMap& afm) {
  1001     return ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>(digraph, afm);
   989     return ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>(digraph, afm);
  1002   }
   990   }
  1391     
  1379     
  1392   };
  1380   };
  1393 
  1381 
  1394   ///\ingroup graph_adaptors
  1382   ///\ingroup graph_adaptors
  1395   ///
  1383   ///
  1396   /// \brief An graph is made from a directed digraph by an adaptor
  1384   /// \brief A graph is made from a directed digraph by an adaptor
  1397   ///
  1385   ///
  1398   /// This adaptor makes an undirected graph from a directed
  1386   /// This adaptor makes an undirected graph from a directed
  1399   /// digraph. All arc of the underlying will be showed in the adaptor
  1387   /// graph. All arc of the underlying digraph will be showed in the
  1400   /// as an edge. Let's see an informal example about using
  1388   /// adaptor as an edge. Let's see an informal example about using
  1401   /// this adaptor:
  1389   /// this adaptor.
  1402   ///
  1390   ///
  1403   /// There is a network of the streets of a town. Of course there are
  1391   /// There is a network of the streets of a town. Of course there are
  1404   /// some one-way street in the town hence the network is a directed
  1392   /// some one-way street in the town hence the network is a directed
  1405   /// one. There is a crazy driver who go oppositely in the one-way
  1393   /// one. There is a crazy driver who go oppositely in the one-way
  1406   /// street without moral sense. Of course he can pass this streets
  1394   /// street without moral sense. Of course he can pass this streets
  1800       
  1788       
  1801     };
  1789     };
  1802 
  1790 
  1803   };
  1791   };
  1804 
  1792 
  1805   /// \brief Base class for split digraph adaptor
       
  1806   ///
       
  1807   /// Base class of split digraph adaptor. In most case you do not need to
       
  1808   /// use it directly but the documented member functions of this class can 
       
  1809   /// be used with the SplitDigraphAdaptor class.
       
  1810   /// \sa SplitDigraphAdaptor
       
  1811   template <typename _Digraph>
  1793   template <typename _Digraph>
  1812   class SplitDigraphAdaptorBase {
  1794   class SplitDigraphAdaptorBase {
  1813   public:
  1795   public:
  1814 
  1796 
  1815     typedef _Digraph Digraph;
  1797     typedef _Digraph Digraph;
  2020     int maxArcId() const {
  2002     int maxArcId() const {
  2021       return std::max(_digraph->maxNodeId() << 1, 
  2003       return std::max(_digraph->maxNodeId() << 1, 
  2022                       (_digraph->maxArcId() << 1) | 1);
  2004                       (_digraph->maxArcId() << 1) | 1);
  2023     }
  2005     }
  2024 
  2006 
  2025     /// \brief Returns true when the node is in-node.
       
  2026     ///
       
  2027     /// Returns true when the node is in-node.
       
  2028     static bool inNode(const Node& n) {
  2007     static bool inNode(const Node& n) {
  2029       return n._in;
  2008       return n._in;
  2030     }
  2009     }
  2031 
  2010 
  2032     /// \brief Returns true when the node is out-node.
       
  2033     ///
       
  2034     /// Returns true when the node is out-node.
       
  2035     static bool outNode(const Node& n) {
  2011     static bool outNode(const Node& n) {
  2036       return !n._in;
  2012       return !n._in;
  2037     }
  2013     }
  2038 
  2014 
  2039     /// \brief Returns true when the arc is arc in the original digraph.
       
  2040     ///
       
  2041     /// Returns true when the arc is arc in the original digraph.
       
  2042     static bool origArc(const Arc& e) {
  2015     static bool origArc(const Arc& e) {
  2043       return e._item.firstState();
  2016       return e._item.firstState();
  2044     }
  2017     }
  2045 
  2018 
  2046     /// \brief Returns true when the arc binds an in-node and an out-node.
       
  2047     ///
       
  2048     /// Returns true when the arc binds an in-node and an out-node.
       
  2049     static bool bindArc(const Arc& e) {
  2019     static bool bindArc(const Arc& e) {
  2050       return e._item.secondState();
  2020       return e._item.secondState();
  2051     }
  2021     }
  2052 
  2022 
  2053     /// \brief Gives back the in-node created from the \c node.
       
  2054     ///
       
  2055     /// Gives back the in-node created from the \c node.
       
  2056     static Node inNode(const DigraphNode& n) {
  2023     static Node inNode(const DigraphNode& n) {
  2057       return Node(n, true);
  2024       return Node(n, true);
  2058     }
  2025     }
  2059 
  2026 
  2060     /// \brief Gives back the out-node created from the \c node.
       
  2061     ///
       
  2062     /// Gives back the out-node created from the \c node.
       
  2063     static Node outNode(const DigraphNode& n) {
  2027     static Node outNode(const DigraphNode& n) {
  2064       return Node(n, false);
  2028       return Node(n, false);
  2065     }
  2029     }
  2066 
  2030 
  2067     /// \brief Gives back the arc binds the two part of the node.
       
  2068     /// 
       
  2069     /// Gives back the arc binds the two part of the node.
       
  2070     static Arc arc(const DigraphNode& n) {
  2031     static Arc arc(const DigraphNode& n) {
  2071       return Arc(n);
  2032       return Arc(n);
  2072     }
  2033     }
  2073 
  2034 
  2074     /// \brief Gives back the arc of the original arc.
       
  2075     /// 
       
  2076     /// Gives back the arc of the original arc.
       
  2077     static Arc arc(const DigraphArc& e) {
  2035     static Arc arc(const DigraphArc& e) {
  2078       return Arc(e);
  2036       return Arc(e);
  2079     }
  2037     }
  2080 
  2038 
  2081     typedef True NodeNumTag;
  2039     typedef True NodeNumTag;
  2273   /// The aim of this class is to run algorithm with node costs if the 
  2231   /// The aim of this class is to run algorithm with node costs if the 
  2274   /// algorithm can use directly just arc costs. In this case we should use
  2232   /// algorithm can use directly just arc costs. In this case we should use
  2275   /// a \c SplitDigraphAdaptor and set the node cost of the digraph to the
  2233   /// a \c SplitDigraphAdaptor and set the node cost of the digraph to the
  2276   /// bind arc in the adapted digraph.
  2234   /// bind arc in the adapted digraph.
  2277   /// 
  2235   /// 
  2278   /// By example a maximum flow algoritm can compute how many arc
  2236   /// For example a maximum flow algorithm can compute how many arc
  2279   /// disjoint paths are in the digraph. But we would like to know how
  2237   /// disjoint paths are in the digraph. But we would like to know how
  2280   /// many node disjoint paths are in the digraph. First we have to
  2238   /// many node disjoint paths are in the digraph. First we have to
  2281   /// adapt the digraph with the \c SplitDigraphAdaptor. Then run the flow
  2239   /// adapt the digraph with the \c SplitDigraphAdaptor. Then run the flow
  2282   /// algorithm on the adapted digraph. The bottleneck of the flow will
  2240   /// algorithm on the adapted digraph. The bottleneck of the flow will
  2283   /// be the bind arcs which bounds the flow with the count of the
  2241   /// be the bind arcs which bounds the flow with the count of the
  2328     : public DigraphAdaptorExtender<SplitDigraphAdaptorBase<_Digraph> > {
  2286     : public DigraphAdaptorExtender<SplitDigraphAdaptorBase<_Digraph> > {
  2329   public:
  2287   public:
  2330     typedef _Digraph Digraph;
  2288     typedef _Digraph Digraph;
  2331     typedef DigraphAdaptorExtender<SplitDigraphAdaptorBase<Digraph> > Parent;
  2289     typedef DigraphAdaptorExtender<SplitDigraphAdaptorBase<Digraph> > Parent;
  2332 
  2290 
       
  2291     typedef typename Digraph::Node DigraphNode;
       
  2292     typedef typename Digraph::Arc DigraphArc;
       
  2293 
  2333     typedef typename Parent::Node Node;
  2294     typedef typename Parent::Node Node;
  2334     typedef typename Parent::Arc Arc;
  2295     typedef typename Parent::Arc Arc;
  2335 
  2296 
  2336     /// \brief Constructor of the adaptor.
  2297     /// \brief Constructor of the adaptor.
  2337     ///
  2298     ///
  2338     /// Constructor of the adaptor.
  2299     /// Constructor of the adaptor.
  2339     SplitDigraphAdaptor(Digraph& g) {
  2300     SplitDigraphAdaptor(Digraph& g) {
  2340       Parent::setDigraph(g);
  2301       Parent::setDigraph(g);
       
  2302     }
       
  2303 
       
  2304     /// \brief Returns true when the node is in-node.
       
  2305     ///
       
  2306     /// Returns true when the node is in-node.
       
  2307     static bool inNode(const Node& n) {
       
  2308       return Parent::inNode(n);
       
  2309     }
       
  2310 
       
  2311     /// \brief Returns true when the node is out-node.
       
  2312     ///
       
  2313     /// Returns true when the node is out-node.
       
  2314     static bool outNode(const Node& n) {
       
  2315       return Parent::outNode(n);
       
  2316     }
       
  2317 
       
  2318     /// \brief Returns true when the arc is arc in the original digraph.
       
  2319     ///
       
  2320     /// Returns true when the arc is arc in the original digraph.
       
  2321     static bool origArc(const Arc& a) {
       
  2322       return Parent::origArc(a);
       
  2323     }
       
  2324 
       
  2325     /// \brief Returns true when the arc binds an in-node and an out-node.
       
  2326     ///
       
  2327     /// Returns true when the arc binds an in-node and an out-node.
       
  2328     static bool bindArc(const Arc& a) {
       
  2329       return Parent::bindArc(a);
       
  2330     }
       
  2331 
       
  2332     /// \brief Gives back the in-node created from the \c node.
       
  2333     ///
       
  2334     /// Gives back the in-node created from the \c node.
       
  2335     static Node inNode(const DigraphNode& n) {
       
  2336       return Parent::inNode(n);
       
  2337     }
       
  2338 
       
  2339     /// \brief Gives back the out-node created from the \c node.
       
  2340     ///
       
  2341     /// Gives back the out-node created from the \c node.
       
  2342     static Node outNode(const DigraphNode& n) {
       
  2343       return Parent::outNode(n);
       
  2344     }
       
  2345 
       
  2346     /// \brief Gives back the arc binds the two part of the node.
       
  2347     /// 
       
  2348     /// Gives back the arc binds the two part of the node.
       
  2349     static Arc arc(const DigraphNode& n) {
       
  2350       return Parent::arc(n);
       
  2351     }
       
  2352 
       
  2353     /// \brief Gives back the arc of the original arc.
       
  2354     /// 
       
  2355     /// Gives back the arc of the original arc.
       
  2356     static Arc arc(const DigraphArc& a) {
       
  2357       return Parent::arc(a);
  2341     }
  2358     }
  2342 
  2359 
  2343     /// \brief NodeMap combined from two original NodeMap
  2360     /// \brief NodeMap combined from two original NodeMap
  2344     ///
  2361     ///
  2345     /// This class adapt two of the original digraph NodeMap to
  2362     /// This class adapt two of the original digraph NodeMap to