lemon/dfs.h
changeset 434 ad483acf1654
parent 319 5e12d7734036
child 435 9afe81e4c543
child 437 6a2a33ad261b
equal deleted inserted replaced
21:e43c2bec5a78 22:df6a2babf106
   117   ///There is also a \ref dfs() "function-type interface" for the DFS
   117   ///There is also a \ref dfs() "function-type interface" for the DFS
   118   ///algorithm, which is convenient in the simplier cases and it can be
   118   ///algorithm, which is convenient in the simplier cases and it can be
   119   ///used easier.
   119   ///used easier.
   120   ///
   120   ///
   121   ///\tparam GR The type of the digraph the algorithm runs on.
   121   ///\tparam GR The type of the digraph the algorithm runs on.
   122   ///The default value is \ref ListDigraph. The value of GR is not used
   122   ///The default type is \ref ListDigraph.
   123   ///directly by \ref Dfs, it is only passed to \ref DfsDefaultTraits.
       
   124   ///\tparam TR Traits class to set various data types used by the algorithm.
       
   125   ///The default traits class is
       
   126   ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
       
   127   ///See \ref DfsDefaultTraits for the documentation of
       
   128   ///a Dfs traits class.
       
   129 #ifdef DOXYGEN
   123 #ifdef DOXYGEN
   130   template <typename GR,
   124   template <typename GR,
   131             typename TR>
   125             typename TR>
   132 #else
   126 #else
   133   template <typename GR=ListDigraph,
   127   template <typename GR=ListDigraph,
   149     ///The type of the map that indicates which nodes are processed.
   143     ///The type of the map that indicates which nodes are processed.
   150     typedef typename TR::ProcessedMap ProcessedMap;
   144     typedef typename TR::ProcessedMap ProcessedMap;
   151     ///The type of the paths.
   145     ///The type of the paths.
   152     typedef PredMapPath<Digraph, PredMap> Path;
   146     typedef PredMapPath<Digraph, PredMap> Path;
   153 
   147 
   154     ///The traits class.
   148     ///The \ref DfsDefaultTraits "traits class" of the algorithm.
   155     typedef TR Traits;
   149     typedef TR Traits;
   156 
   150 
   157   private:
   151   private:
   158 
   152 
   159     typedef typename Digraph::Node Node;
   153     typedef typename Digraph::Node Node;
   228     ///\brief \ref named-templ-param "Named parameter" for setting
   222     ///\brief \ref named-templ-param "Named parameter" for setting
   229     ///PredMap type.
   223     ///PredMap type.
   230     ///
   224     ///
   231     ///\ref named-templ-param "Named parameter" for setting
   225     ///\ref named-templ-param "Named parameter" for setting
   232     ///PredMap type.
   226     ///PredMap type.
       
   227     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   233     template <class T>
   228     template <class T>
   234     struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
   229     struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
   235       typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
   230       typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
   236     };
   231     };
   237 
   232 
   247     ///\brief \ref named-templ-param "Named parameter" for setting
   242     ///\brief \ref named-templ-param "Named parameter" for setting
   248     ///DistMap type.
   243     ///DistMap type.
   249     ///
   244     ///
   250     ///\ref named-templ-param "Named parameter" for setting
   245     ///\ref named-templ-param "Named parameter" for setting
   251     ///DistMap type.
   246     ///DistMap type.
       
   247     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   252     template <class T>
   248     template <class T>
   253     struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
   249     struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
   254       typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
   250       typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
   255     };
   251     };
   256 
   252 
   266     ///\brief \ref named-templ-param "Named parameter" for setting
   262     ///\brief \ref named-templ-param "Named parameter" for setting
   267     ///ReachedMap type.
   263     ///ReachedMap type.
   268     ///
   264     ///
   269     ///\ref named-templ-param "Named parameter" for setting
   265     ///\ref named-templ-param "Named parameter" for setting
   270     ///ReachedMap type.
   266     ///ReachedMap type.
       
   267     ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
   271     template <class T>
   268     template <class T>
   272     struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
   269     struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
   273       typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
   270       typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
   274     };
   271     };
   275 
   272 
   285     ///\brief \ref named-templ-param "Named parameter" for setting
   282     ///\brief \ref named-templ-param "Named parameter" for setting
   286     ///ProcessedMap type.
   283     ///ProcessedMap type.
   287     ///
   284     ///
   288     ///\ref named-templ-param "Named parameter" for setting
   285     ///\ref named-templ-param "Named parameter" for setting
   289     ///ProcessedMap type.
   286     ///ProcessedMap type.
       
   287     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   290     template <class T>
   288     template <class T>
   291     struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
   289     struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
   292       typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
   290       typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
   293     };
   291     };
   294 
   292 
   336     }
   334     }
   337 
   335 
   338     ///Sets the map that stores the predecessor arcs.
   336     ///Sets the map that stores the predecessor arcs.
   339 
   337 
   340     ///Sets the map that stores the predecessor arcs.
   338     ///Sets the map that stores the predecessor arcs.
   341     ///If you don't use this function before calling \ref run(),
   339     ///If you don't use this function before calling \ref run(Node) "run()"
   342     ///it will allocate one. The destructor deallocates this
   340     ///or \ref init(), an instance will be allocated automatically.
   343     ///automatically allocated map, of course.
   341     ///The destructor deallocates this automatically allocated map,
       
   342     ///of course.
   344     ///\return <tt> (*this) </tt>
   343     ///\return <tt> (*this) </tt>
   345     Dfs &predMap(PredMap &m)
   344     Dfs &predMap(PredMap &m)
   346     {
   345     {
   347       if(local_pred) {
   346       if(local_pred) {
   348         delete _pred;
   347         delete _pred;
   353     }
   352     }
   354 
   353 
   355     ///Sets the map that indicates which nodes are reached.
   354     ///Sets the map that indicates which nodes are reached.
   356 
   355 
   357     ///Sets the map that indicates which nodes are reached.
   356     ///Sets the map that indicates which nodes are reached.
   358     ///If you don't use this function before calling \ref run(),
   357     ///If you don't use this function before calling \ref run(Node) "run()"
   359     ///it will allocate one. The destructor deallocates this
   358     ///or \ref init(), an instance will be allocated automatically.
   360     ///automatically allocated map, of course.
   359     ///The destructor deallocates this automatically allocated map,
       
   360     ///of course.
   361     ///\return <tt> (*this) </tt>
   361     ///\return <tt> (*this) </tt>
   362     Dfs &reachedMap(ReachedMap &m)
   362     Dfs &reachedMap(ReachedMap &m)
   363     {
   363     {
   364       if(local_reached) {
   364       if(local_reached) {
   365         delete _reached;
   365         delete _reached;
   370     }
   370     }
   371 
   371 
   372     ///Sets the map that indicates which nodes are processed.
   372     ///Sets the map that indicates which nodes are processed.
   373 
   373 
   374     ///Sets the map that indicates which nodes are processed.
   374     ///Sets the map that indicates which nodes are processed.
   375     ///If you don't use this function before calling \ref run(),
   375     ///If you don't use this function before calling \ref run(Node) "run()"
   376     ///it will allocate one. The destructor deallocates this
   376     ///or \ref init(), an instance will be allocated automatically.
   377     ///automatically allocated map, of course.
   377     ///The destructor deallocates this automatically allocated map,
       
   378     ///of course.
   378     ///\return <tt> (*this) </tt>
   379     ///\return <tt> (*this) </tt>
   379     Dfs &processedMap(ProcessedMap &m)
   380     Dfs &processedMap(ProcessedMap &m)
   380     {
   381     {
   381       if(local_processed) {
   382       if(local_processed) {
   382         delete _processed;
   383         delete _processed;
   388 
   389 
   389     ///Sets the map that stores the distances of the nodes.
   390     ///Sets the map that stores the distances of the nodes.
   390 
   391 
   391     ///Sets the map that stores the distances of the nodes calculated by
   392     ///Sets the map that stores the distances of the nodes calculated by
   392     ///the algorithm.
   393     ///the algorithm.
   393     ///If you don't use this function before calling \ref run(),
   394     ///If you don't use this function before calling \ref run(Node) "run()"
   394     ///it will allocate one. The destructor deallocates this
   395     ///or \ref init(), an instance will be allocated automatically.
   395     ///automatically allocated map, of course.
   396     ///The destructor deallocates this automatically allocated map,
       
   397     ///of course.
   396     ///\return <tt> (*this) </tt>
   398     ///\return <tt> (*this) </tt>
   397     Dfs &distMap(DistMap &m)
   399     Dfs &distMap(DistMap &m)
   398     {
   400     {
   399       if(local_dist) {
   401       if(local_dist) {
   400         delete _dist;
   402         delete _dist;
   404       return *this;
   406       return *this;
   405     }
   407     }
   406 
   408 
   407   public:
   409   public:
   408 
   410 
   409     ///\name Execution control
   411     ///\name Execution Control
   410     ///The simplest way to execute the algorithm is to use
   412     ///The simplest way to execute the DFS algorithm is to use one of the
   411     ///one of the member functions called \ref lemon::Dfs::run() "run()".
   413     ///member functions called \ref run(Node) "run()".\n
   412     ///\n
   414     ///If you need more control on the execution, first you have to call
   413     ///If you need more control on the execution, first you must call
   415     ///\ref init(), then you can add a source node with \ref addSource()
   414     ///\ref lemon::Dfs::init() "init()", then you can add a source node
   416     ///and perform the actual computation with \ref start().
   415     ///with \ref lemon::Dfs::addSource() "addSource()".
   417     ///This procedure can be repeated if there are nodes that have not
   416     ///Finally \ref lemon::Dfs::start() "start()" will perform the
   418     ///been reached.
   417     ///actual path computation.
       
   418 
   419 
   419     ///@{
   420     ///@{
   420 
   421 
       
   422     ///\brief Initializes the internal data structures.
       
   423     ///
   421     ///Initializes the internal data structures.
   424     ///Initializes the internal data structures.
   422 
       
   423     ///Initializes the internal data structures.
       
   424     ///
       
   425     void init()
   425     void init()
   426     {
   426     {
   427       create_maps();
   427       create_maps();
   428       _stack.resize(countNodes(*G));
   428       _stack.resize(countNodes(*G));
   429       _stack_head=-1;
   429       _stack_head=-1;
   436 
   436 
   437     ///Adds a new source node.
   437     ///Adds a new source node.
   438 
   438 
   439     ///Adds a new source node to the set of nodes to be processed.
   439     ///Adds a new source node to the set of nodes to be processed.
   440     ///
   440     ///
   441     ///\pre The stack must be empty. (Otherwise the algorithm gives
   441     ///\pre The stack must be empty. Otherwise the algorithm gives
   442     ///false results.)
   442     ///wrong results. (One of the outgoing arcs of all the source nodes
   443     ///
   443     ///except for the last one will not be visited and distances will
   444     ///\warning Distances will be wrong (or at least strange) in case of
   444     ///also be wrong.)
   445     ///multiple sources.
       
   446     void addSource(Node s)
   445     void addSource(Node s)
   447     {
   446     {
   448       LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
   447       LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
   449       if(!(*_reached)[s])
   448       if(!(*_reached)[s])
   450         {
   449         {
   504     OutArcIt nextArc() const
   503     OutArcIt nextArc() const
   505     {
   504     {
   506       return _stack_head>=0?_stack[_stack_head]:INVALID;
   505       return _stack_head>=0?_stack[_stack_head]:INVALID;
   507     }
   506     }
   508 
   507 
   509     ///\brief Returns \c false if there are nodes
   508     ///Returns \c false if there are nodes to be processed.
   510     ///to be processed.
   509 
   511     ///
   510     ///Returns \c false if there are nodes to be processed
   512     ///Returns \c false if there are nodes
   511     ///in the queue (stack).
   513     ///to be processed in the queue (stack).
       
   514     bool emptyQueue() const { return _stack_head<0; }
   512     bool emptyQueue() const { return _stack_head<0; }
   515 
   513 
   516     ///Returns the number of the nodes to be processed.
   514     ///Returns the number of the nodes to be processed.
   517 
   515 
   518     ///Returns the number of the nodes to be processed in the queue (stack).
   516     ///Returns the number of the nodes to be processed
       
   517     ///in the queue (stack).
   519     int queueSize() const { return _stack_head+1; }
   518     int queueSize() const { return _stack_head+1; }
   520 
   519 
   521     ///Executes the algorithm.
   520     ///Executes the algorithm.
   522 
   521 
   523     ///Executes the algorithm.
   522     ///Executes the algorithm.
   635 
   634 
   636     ///This method runs the %DFS algorithm in order to compute the
   635     ///This method runs the %DFS algorithm in order to compute the
   637     ///%DFS path to each node.
   636     ///%DFS path to each node.
   638     ///
   637     ///
   639     ///The algorithm computes
   638     ///The algorithm computes
   640     ///- the %DFS tree,
   639     ///- the %DFS tree (forest),
   641     ///- the distance of each node from the root in the %DFS tree.
   640     ///- the distance of each node from the root(s) in the %DFS tree.
   642     ///
   641     ///
   643     ///\note <tt>d.run()</tt> is just a shortcut of the following code.
   642     ///\note <tt>d.run()</tt> is just a shortcut of the following code.
   644     ///\code
   643     ///\code
   645     ///  d.init();
   644     ///  d.init();
   646     ///  for (NodeIt n(digraph); n != INVALID; ++n) {
   645     ///  for (NodeIt n(digraph); n != INVALID; ++n) {
   661     }
   660     }
   662 
   661 
   663     ///@}
   662     ///@}
   664 
   663 
   665     ///\name Query Functions
   664     ///\name Query Functions
   666     ///The result of the %DFS algorithm can be obtained using these
   665     ///The results of the DFS algorithm can be obtained using these
   667     ///functions.\n
   666     ///functions.\n
   668     ///Either \ref lemon::Dfs::run() "run()" or \ref lemon::Dfs::start()
   667     ///Either \ref run(Node) "run()" or \ref start() should be called
   669     ///"start()" must be called before using them.
   668     ///before using them.
   670 
   669 
   671     ///@{
   670     ///@{
   672 
   671 
   673     ///The DFS path to a node.
   672     ///The DFS path to a node.
   674 
   673 
   675     ///Returns the DFS path to a node.
   674     ///Returns the DFS path to a node.
   676     ///
   675     ///
   677     ///\warning \c t should be reachable from the root.
   676     ///\warning \c t should be reached from the root(s).
   678     ///
   677     ///
   679     ///\pre Either \ref run() or \ref start() must be called before
   678     ///\pre Either \ref run(Node) "run()" or \ref init()
   680     ///using this function.
   679     ///must be called before using this function.
   681     Path path(Node t) const { return Path(*G, *_pred, t); }
   680     Path path(Node t) const { return Path(*G, *_pred, t); }
   682 
   681 
   683     ///The distance of a node from the root.
   682     ///The distance of a node from the root(s).
   684 
   683 
   685     ///Returns the distance of a node from the root.
   684     ///Returns the distance of a node from the root(s).
   686     ///
   685     ///
   687     ///\warning If node \c v is not reachable from the root, then
   686     ///\warning If node \c v is not reached from the root(s), then
   688     ///the return value of this function is undefined.
   687     ///the return value of this function is undefined.
   689     ///
   688     ///
   690     ///\pre Either \ref run() or \ref start() must be called before
   689     ///\pre Either \ref run(Node) "run()" or \ref init()
   691     ///using this function.
   690     ///must be called before using this function.
   692     int dist(Node v) const { return (*_dist)[v]; }
   691     int dist(Node v) const { return (*_dist)[v]; }
   693 
   692 
   694     ///Returns the 'previous arc' of the %DFS tree for a node.
   693     ///Returns the 'previous arc' of the %DFS tree for a node.
   695 
   694 
   696     ///This function returns the 'previous arc' of the %DFS tree for the
   695     ///This function returns the 'previous arc' of the %DFS tree for the
   697     ///node \c v, i.e. it returns the last arc of a %DFS path from the
   696     ///node \c v, i.e. it returns the last arc of a %DFS path from a
   698     ///root to \c v. It is \c INVALID
   697     ///root to \c v. It is \c INVALID if \c v is not reached from the
   699     ///if \c v is not reachable from the root(s) or if \c v is a root.
   698     ///root(s) or if \c v is a root.
   700     ///
   699     ///
   701     ///The %DFS tree used here is equal to the %DFS tree used in
   700     ///The %DFS tree used here is equal to the %DFS tree used in
   702     ///\ref predNode().
   701     ///\ref predNode().
   703     ///
   702     ///
   704     ///\pre Either \ref run() or \ref start() must be called before using
   703     ///\pre Either \ref run(Node) "run()" or \ref init()
   705     ///this function.
   704     ///must be called before using this function.
   706     Arc predArc(Node v) const { return (*_pred)[v];}
   705     Arc predArc(Node v) const { return (*_pred)[v];}
   707 
   706 
   708     ///Returns the 'previous node' of the %DFS tree.
   707     ///Returns the 'previous node' of the %DFS tree.
   709 
   708 
   710     ///This function returns the 'previous node' of the %DFS
   709     ///This function returns the 'previous node' of the %DFS
   711     ///tree for the node \c v, i.e. it returns the last but one node
   710     ///tree for the node \c v, i.e. it returns the last but one node
   712     ///from a %DFS path from the root to \c v. It is \c INVALID
   711     ///from a %DFS path from a root to \c v. It is \c INVALID
   713     ///if \c v is not reachable from the root(s) or if \c v is a root.
   712     ///if \c v is not reached from the root(s) or if \c v is a root.
   714     ///
   713     ///
   715     ///The %DFS tree used here is equal to the %DFS tree used in
   714     ///The %DFS tree used here is equal to the %DFS tree used in
   716     ///\ref predArc().
   715     ///\ref predArc().
   717     ///
   716     ///
   718     ///\pre Either \ref run() or \ref start() must be called before
   717     ///\pre Either \ref run(Node) "run()" or \ref init()
   719     ///using this function.
   718     ///must be called before using this function.
   720     Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
   719     Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
   721                                   G->source((*_pred)[v]); }
   720                                   G->source((*_pred)[v]); }
   722 
   721 
   723     ///\brief Returns a const reference to the node map that stores the
   722     ///\brief Returns a const reference to the node map that stores the
   724     ///distances of the nodes.
   723     ///distances of the nodes.
   725     ///
   724     ///
   726     ///Returns a const reference to the node map that stores the
   725     ///Returns a const reference to the node map that stores the
   727     ///distances of the nodes calculated by the algorithm.
   726     ///distances of the nodes calculated by the algorithm.
   728     ///
   727     ///
   729     ///\pre Either \ref run() or \ref init()
   728     ///\pre Either \ref run(Node) "run()" or \ref init()
   730     ///must be called before using this function.
   729     ///must be called before using this function.
   731     const DistMap &distMap() const { return *_dist;}
   730     const DistMap &distMap() const { return *_dist;}
   732 
   731 
   733     ///\brief Returns a const reference to the node map that stores the
   732     ///\brief Returns a const reference to the node map that stores the
   734     ///predecessor arcs.
   733     ///predecessor arcs.
   735     ///
   734     ///
   736     ///Returns a const reference to the node map that stores the predecessor
   735     ///Returns a const reference to the node map that stores the predecessor
   737     ///arcs, which form the DFS tree.
   736     ///arcs, which form the DFS tree.
   738     ///
   737     ///
   739     ///\pre Either \ref run() or \ref init()
   738     ///\pre Either \ref run(Node) "run()" or \ref init()
   740     ///must be called before using this function.
   739     ///must be called before using this function.
   741     const PredMap &predMap() const { return *_pred;}
   740     const PredMap &predMap() const { return *_pred;}
   742 
   741 
   743     ///Checks if a node is reachable from the root(s).
   742     ///Checks if a node is reached from the root(s).
   744 
   743 
   745     ///Returns \c true if \c v is reachable from the root(s).
   744     ///Returns \c true if \c v is reached from the root(s).
   746     ///\pre Either \ref run() or \ref start()
   745     ///
       
   746     ///\pre Either \ref run(Node) "run()" or \ref init()
   747     ///must be called before using this function.
   747     ///must be called before using this function.
   748     bool reached(Node v) const { return (*_reached)[v]; }
   748     bool reached(Node v) const { return (*_reached)[v]; }
   749 
   749 
   750     ///@}
   750     ///@}
   751   };
   751   };
   887 
   887 
   888   /// Auxiliary class for the function-type interface of DFS algorithm.
   888   /// Auxiliary class for the function-type interface of DFS algorithm.
   889 
   889 
   890   /// This auxiliary class is created to implement the
   890   /// This auxiliary class is created to implement the
   891   /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
   891   /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
   892   /// It does not have own \ref run() method, it uses the functions
   892   /// It does not have own \ref run(Node) "run()" method, it uses the
   893   /// and features of the plain \ref Dfs.
   893   /// functions and features of the plain \ref Dfs.
   894   ///
   894   ///
   895   /// This class should only be used through the \ref dfs() function,
   895   /// This class should only be used through the \ref dfs() function,
   896   /// which makes it easier to use the algorithm.
   896   /// which makes it easier to use the algorithm.
   897   template<class TR>
   897   template<class TR>
   898   class DfsWizard : public TR
   898   class DfsWizard : public TR
  1108   ///  dfs(g).predMap(preds).distMap(dists).run(s);
  1108   ///  dfs(g).predMap(preds).distMap(dists).run(s);
  1109   ///
  1109   ///
  1110   ///  // Compute the DFS path from s to t
  1110   ///  // Compute the DFS path from s to t
  1111   ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
  1111   ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
  1112   ///\endcode
  1112   ///\endcode
  1113 
  1113   ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
  1114   ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
       
  1115   ///to the end of the parameter list.
  1114   ///to the end of the parameter list.
  1116   ///\sa DfsWizard
  1115   ///\sa DfsWizard
  1117   ///\sa Dfs
  1116   ///\sa Dfs
  1118   template<class GR>
  1117   template<class GR>
  1119   DfsWizard<DfsWizardBase<GR> >
  1118   DfsWizard<DfsWizardBase<GR> >
  1307 
  1306 
  1308   public:
  1307   public:
  1309 
  1308 
  1310     typedef DfsVisit Create;
  1309     typedef DfsVisit Create;
  1311 
  1310 
  1312     /// \name Named template parameters
  1311     /// \name Named Template Parameters
  1313 
  1312 
  1314     ///@{
  1313     ///@{
  1315     template <class T>
  1314     template <class T>
  1316     struct SetReachedMapTraits : public Traits {
  1315     struct SetReachedMapTraits : public Traits {
  1317       typedef T ReachedMap;
  1316       typedef T ReachedMap;
  1349     }
  1348     }
  1350 
  1349 
  1351     /// \brief Sets the map that indicates which nodes are reached.
  1350     /// \brief Sets the map that indicates which nodes are reached.
  1352     ///
  1351     ///
  1353     /// Sets the map that indicates which nodes are reached.
  1352     /// Sets the map that indicates which nodes are reached.
  1354     /// If you don't use this function before calling \ref run(),
  1353     /// If you don't use this function before calling \ref run(Node) "run()"
  1355     /// it will allocate one. The destructor deallocates this
  1354     /// or \ref init(), an instance will be allocated automatically.
  1356     /// automatically allocated map, of course.
  1355     /// The destructor deallocates this automatically allocated map,
       
  1356     /// of course.
  1357     /// \return <tt> (*this) </tt>
  1357     /// \return <tt> (*this) </tt>
  1358     DfsVisit &reachedMap(ReachedMap &m) {
  1358     DfsVisit &reachedMap(ReachedMap &m) {
  1359       if(local_reached) {
  1359       if(local_reached) {
  1360         delete _reached;
  1360         delete _reached;
  1361         local_reached=false;
  1361         local_reached=false;
  1364       return *this;
  1364       return *this;
  1365     }
  1365     }
  1366 
  1366 
  1367   public:
  1367   public:
  1368 
  1368 
  1369     /// \name Execution control
  1369     /// \name Execution Control
  1370     /// The simplest way to execute the algorithm is to use
  1370     /// The simplest way to execute the DFS algorithm is to use one of the
  1371     /// one of the member functions called \ref lemon::DfsVisit::run()
  1371     /// member functions called \ref run(Node) "run()".\n
  1372     /// "run()".
  1372     /// If you need more control on the execution, first you have to call
  1373     /// \n
  1373     /// \ref init(), then you can add a source node with \ref addSource()
  1374     /// If you need more control on the execution, first you must call
  1374     /// and perform the actual computation with \ref start().
  1375     /// \ref lemon::DfsVisit::init() "init()", then you can add several
  1375     /// This procedure can be repeated if there are nodes that have not
  1376     /// source nodes with \ref lemon::DfsVisit::addSource() "addSource()".
  1376     /// been reached.
  1377     /// Finally \ref lemon::DfsVisit::start() "start()" will perform the
       
  1378     /// actual path computation.
       
  1379 
  1377 
  1380     /// @{
  1378     /// @{
  1381 
  1379 
  1382     /// \brief Initializes the internal data structures.
  1380     /// \brief Initializes the internal data structures.
  1383     ///
  1381     ///
  1389       for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
  1387       for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
  1390         _reached->set(u, false);
  1388         _reached->set(u, false);
  1391       }
  1389       }
  1392     }
  1390     }
  1393 
  1391 
  1394     ///Adds a new source node.
  1392     /// \brief Adds a new source node.
  1395 
  1393     ///
  1396     ///Adds a new source node to the set of nodes to be processed.
  1394     /// Adds a new source node to the set of nodes to be processed.
  1397     ///
  1395     ///
  1398     ///\pre The stack must be empty. (Otherwise the algorithm gives
  1396     /// \pre The stack must be empty. Otherwise the algorithm gives
  1399     ///false results.)
  1397     /// wrong results. (One of the outgoing arcs of all the source nodes
  1400     ///
  1398     /// except for the last one will not be visited and distances will
  1401     ///\warning Distances will be wrong (or at least strange) in case of
  1399     /// also be wrong.)
  1402     ///multiple sources.
       
  1403     void addSource(Node s)
  1400     void addSource(Node s)
  1404     {
  1401     {
  1405       LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
  1402       LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
  1406       if(!(*_reached)[s]) {
  1403       if(!(*_reached)[s]) {
  1407           _reached->set(s,true);
  1404           _reached->set(s,true);
  1587 
  1584 
  1588     /// This method runs the %DFS algorithm in order to
  1585     /// This method runs the %DFS algorithm in order to
  1589     /// compute the %DFS path to each node.
  1586     /// compute the %DFS path to each node.
  1590     ///
  1587     ///
  1591     /// The algorithm computes
  1588     /// The algorithm computes
  1592     /// - the %DFS tree,
  1589     /// - the %DFS tree (forest),
  1593     /// - the distance of each node from the root in the %DFS tree.
  1590     /// - the distance of each node from the root(s) in the %DFS tree.
  1594     ///
  1591     ///
  1595     /// \note <tt>d.run()</tt> is just a shortcut of the following code.
  1592     /// \note <tt>d.run()</tt> is just a shortcut of the following code.
  1596     ///\code
  1593     ///\code
  1597     ///   d.init();
  1594     ///   d.init();
  1598     ///   for (NodeIt n(digraph); n != INVALID; ++n) {
  1595     ///   for (NodeIt n(digraph); n != INVALID; ++n) {
  1613     }
  1610     }
  1614 
  1611 
  1615     ///@}
  1612     ///@}
  1616 
  1613 
  1617     /// \name Query Functions
  1614     /// \name Query Functions
  1618     /// The result of the %DFS algorithm can be obtained using these
  1615     /// The results of the DFS algorithm can be obtained using these
  1619     /// functions.\n
  1616     /// functions.\n
  1620     /// Either \ref lemon::DfsVisit::run() "run()" or
  1617     /// Either \ref run(Node) "run()" or \ref start() should be called
  1621     /// \ref lemon::DfsVisit::start() "start()" must be called before
  1618     /// before using them.
  1622     /// using them.
  1619 
  1623     ///@{
  1620     ///@{
  1624 
  1621 
  1625     /// \brief Checks if a node is reachable from the root(s).
  1622     /// \brief Checks if a node is reached from the root(s).
  1626     ///
  1623     ///
  1627     /// Returns \c true if \c v is reachable from the root(s).
  1624     /// Returns \c true if \c v is reached from the root(s).
  1628     /// \pre Either \ref run() or \ref start()
  1625     ///
       
  1626     /// \pre Either \ref run(Node) "run()" or \ref init()
  1629     /// must be called before using this function.
  1627     /// must be called before using this function.
  1630     bool reached(Node v) { return (*_reached)[v]; }
  1628     bool reached(Node v) { return (*_reached)[v]; }
  1631 
  1629 
  1632     ///@}
  1630     ///@}
  1633 
  1631