/* -*- mode: C++; indent-tabs-mode: nil; -*-
  * This file is a part of LEMON, a generic C++ optimization library.
  * Copyright (C) 2003-2009
  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
  * (Egervary Research Group on Combinatorial Optimization, EGRES).
  * Permission to use, modify and distribute this software is granted
  * provided that this copyright notice appears in all copies. For
  * precise terms see the accompanying LICENSE file.
  * This software is provided "AS IS" with no warranty of any kind,
  * express or implied, and with no claim as to its suitability for any
 #include <lemon/list_graph.h>
 #include <lemon/bits/path_dump.h>
   ///Default traits class of Dfs class.
   ///Default traits class of Dfs class.
   ///\tparam GR Digraph type.
     ///The type of the digraph the algorithm runs on.
     ///\brief The type of the map that stores the predecessor
     ///arcs of the %DFS paths.
     ///The type of the map that stores the predecessor
     ///arcs of the %DFS paths.
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
     ///Instantiates a \c PredMap.
     ///This function instantiates a \ref PredMap.
     ///\param g is the digraph, to which we would like to define the
     static PredMap *createPredMap(const Digraph &g)
     ///The type of the map that indicates which nodes are processed.
     ///The type of the map that indicates which nodes are processed.
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     ///By default it is a NullMap.
     typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
     ///Instantiates a \c ProcessedMap.
     ///This function instantiates a \ref ProcessedMap.
     ///\param g is the digraph, to which
     ///we would like to define the \ref ProcessedMap.
     static ProcessedMap *createProcessedMap(const Digraph &g)
     static ProcessedMap *createProcessedMap(const Digraph &)
       return new ProcessedMap();
     ///The type of the map that indicates which nodes are reached.
     ///The type of the map that indicates which nodes are reached.
     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     typedef typename Digraph::template NodeMap<bool> ReachedMap;
     ///Instantiates a \c ReachedMap.
     ///This function instantiates a \ref ReachedMap.
     ///\param g is the digraph, to which
     ///we would like to define the \ref ReachedMap.
     static ReachedMap *createReachedMap(const Digraph &g)
       return new ReachedMap(g);
     ///The type of the map that stores the distances of the nodes.
     ///The type of the map that stores the distances of the nodes.
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     typedef typename Digraph::template NodeMap<int> DistMap;
     ///Instantiates a \c DistMap.
     ///This function instantiates a \ref DistMap.
     ///\param g is the digraph, to which we would like to define the
     static DistMap *createDistMap(const Digraph &g)
   ///This class provides an efficient implementation of the %DFS algorithm.
   ///There is also a \ref dfs() "function-type interface" for the DFS
   ///algorithm, which is convenient in the simplier cases and it can be
   ///\tparam GR The type of the digraph the algorithm runs on.
   ///The default type is \ref ListDigraph.
   template <typename GR=ListDigraph,
             typename TR=DfsDefaultTraits<GR> >
     ///The type of the digraph the algorithm runs on.
     typedef typename TR::Digraph Digraph;
     ///\brief The type of the map that stores the predecessor arcs of the
     typedef typename TR::PredMap PredMap;
     ///The type of the map that stores the distances of the nodes.
     typedef typename TR::DistMap DistMap;
     ///The type of the map that indicates which nodes are reached.
     typedef typename TR::ReachedMap ReachedMap;
     ///The type of the map that indicates which nodes are processed.
     typedef typename TR::ProcessedMap ProcessedMap;
     ///The type of the paths.
     typedef PredMapPath<Digraph, PredMap> Path;
     ///The \ref DfsDefaultTraits "traits class" of the algorithm.
     typedef typename Digraph::Node Node;
     typedef typename Digraph::NodeIt NodeIt;
     typedef typename Digraph::Arc Arc;
     typedef typename Digraph::OutArcIt OutArcIt;
     //Pointer to the underlying digraph.
     //Pointer to the map of predecessor arcs.
     //Indicates if _pred is locally allocated (true) or not.
     //Pointer to the map of distances.
     //Indicates if _dist is locally allocated (true) or not.
     //Pointer to the map of reached status of the nodes.
     //Indicates if _reached is locally allocated (true) or not.
     //Pointer to the map of processed status of the nodes.
     ProcessedMap *_processed;
     //Indicates if _processed is locally allocated (true) or not.
     std::vector<typename Digraph::OutArcIt> _stack;
     //Creates the maps if necessary.
         _pred = Traits::createPredMap(*G);
         _dist = Traits::createDistMap(*G);
         _reached = Traits::createReachedMap(*G);
         _processed = Traits::createProcessedMap(*G);
     ///\name Named Template Parameters
     struct SetPredMapTraits : public Traits {
       static PredMap *createPredMap(const Digraph &)
         LEMON_ASSERT(false, "PredMap is not initialized");
         return 0; // ignore warnings
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" for setting
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
       typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
     struct SetDistMapTraits : public Traits {
       static DistMap *createDistMap(const Digraph &)
         LEMON_ASSERT(false, "DistMap is not initialized");
         return 0; // ignore warnings
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" for setting
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
       typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
     struct SetReachedMapTraits : public Traits {
       static ReachedMap *createReachedMap(const Digraph &)
         LEMON_ASSERT(false, "ReachedMap is not initialized");
         return 0; // ignore warnings
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" for setting
     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
       typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
     struct SetProcessedMapTraits : public Traits {
       static ProcessedMap *createProcessedMap(const Digraph &)
         LEMON_ASSERT(false, "ProcessedMap is not initialized");
         return 0; // ignore warnings
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" for setting
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
       typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
     struct SetStandardProcessedMapTraits : public Traits {
       typedef typename Digraph::template NodeMap<bool> ProcessedMap;
       static ProcessedMap *createProcessedMap(const Digraph &g)
         return new ProcessedMap(g);
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
     ///\ref named-templ-param "Named parameter" for setting
     ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
     ///If you don't set it explicitly, it will be automatically allocated.
     struct SetStandardProcessedMap :
       public Dfs< Digraph, SetStandardProcessedMapTraits > {
       typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
     ///\param g The digraph the algorithm runs on.
       _pred(NULL), local_pred(false),
       _dist(NULL), local_dist(false),
       _reached(NULL), local_reached(false),
       _processed(NULL), local_processed(false)
       if(local_pred) delete _pred;
       if(local_dist) delete _dist;
       if(local_reached) delete _reached;
       if(local_processed) delete _processed;
     ///Sets the map that stores the predecessor arcs.
     ///Sets the map that stores the predecessor arcs.
     ///If you don't use this function before calling \ref run(Node) "run()"
     ///or \ref init(), an instance will be allocated automatically.
     ///The destructor deallocates this automatically allocated map,
     ///\return <tt> (*this) </tt>
     ///Sets the map that indicates which nodes are reached.
     ///Sets the map that indicates which nodes are reached.
     ///If you don't use this function before calling \ref run(Node) "run()"
     ///or \ref init(), an instance will be allocated automatically.
     ///The destructor deallocates this automatically allocated map,
     ///\return <tt> (*this) </tt>
     Dfs &reachedMap(ReachedMap &m)
     ///Sets the map that indicates which nodes are processed.
     ///Sets the map that indicates which nodes are processed.
     ///If you don't use this function before calling \ref run(Node) "run()"
     ///or \ref init(), an instance will be allocated automatically.
     ///The destructor deallocates this automatically allocated map,
     ///\return <tt> (*this) </tt>
     Dfs &processedMap(ProcessedMap &m)
     ///Sets the map that stores the distances of the nodes.
     ///Sets the map that stores the distances of the nodes calculated by
     ///If you don't use this function before calling \ref run(Node) "run()"
     ///or \ref init(), an instance will be allocated automatically.
     ///The destructor deallocates this automatically allocated map,
     ///\return <tt> (*this) </tt>
     ///\name Execution Control
     ///The simplest way to execute the DFS algorithm is to use one of the
     ///member functions called \ref run(Node) "run()".\n
     ///If you need better control on the execution, you have to call
     ///\ref init() first, then you can add a source node with \ref addSource()
     ///and perform the actual computation with \ref start().
     ///This procedure can be repeated if there are nodes that have not
     ///\brief Initializes the internal data structures.
     ///Initializes the internal data structures.
       _stack.resize(countNodes(*G));
       for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
         _processed->set(u,false);
     ///Adds a new source node.
     ///Adds a new source node to the set of nodes to be processed.
     ///\pre The stack must be empty. Otherwise the algorithm gives
     ///wrong results. (One of the outgoing arcs of all the source nodes
     ///except for the last one will not be visited and distances will
       LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
             _dist->set(s,_stack_head);
     ///Processes the next arc.
     ///Processes the next arc.
     ///\return The processed arc.
     ///\pre The stack must not be empty.
       Arc e=_stack[_stack_head];
       if(!(*_reached)[m=G->target(e)]) {
         _stack[_stack_head] = OutArcIt(*G, m);
         _dist->set(m,_stack_head);
       while(_stack_head>=0 && _stack[_stack_head]==INVALID) {
           m=G->source(_stack[_stack_head]);
     ///Next arc to be processed.
     ///Next arc to be processed.
     ///\return The next arc to be processed or \c INVALID if the stack
       return _stack_head>=0?_stack[_stack_head]:INVALID;
     ///Returns \c false if there are nodes to be processed.
     ///Returns \c false if there are nodes to be processed
     bool emptyQueue() const { return _stack_head<0; }
     ///Returns the number of the nodes to be processed.
     ///Returns the number of the nodes to be processed
     int queueSize() const { return _stack_head+1; }
     ///Executes the algorithm.
     ///Executes the algorithm.
     ///This method runs the %DFS algorithm from the root node
     ///in order to compute the DFS path to each node.
     /// The algorithm computes
     ///- the distance of each node from the root in the %DFS tree.
     ///\pre init() must be called and a root node should be
     ///added with addSource() before using this function.
     ///\note <tt>d.start()</tt> is just a shortcut of the following code.
     ///  while ( !d.emptyQueue() ) {
       while ( !emptyQueue() ) processNextArc();
     ///Executes the algorithm until the given target node is reached.
     ///Executes the algorithm until the given target node is reached.
     ///This method runs the %DFS algorithm from the root node
     ///in order to compute the DFS path to \c t.
     ///The algorithm computes
     ///- the %DFS path to \c t,
     ///- the distance of \c t from the root in the %DFS tree.
     ///\pre init() must be called and a root node should be
     ///added with addSource() before using this function.
       while ( !emptyQueue() && G->target(_stack[_stack_head])!=t )
     ///Executes the algorithm until a condition is met.
     ///Executes the algorithm until a condition is met.
     ///This method runs the %DFS algorithm from the root node
     ///until an arc \c a with <tt>am[a]</tt> true is found.
     ///\param am A \c bool (or convertible) arc map. The algorithm
     ///will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
     ///\return The reached arc \c a with <tt>am[a]</tt> true or
     ///\c INVALID if no such arc was found.
     ///\pre init() must be called and a root node should be
     ///added with addSource() before using this function.
     ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
     template<class ArcBoolMap>
     Arc start(const ArcBoolMap &am)
       while ( !emptyQueue() && !am[_stack[_stack_head]] )
       return emptyQueue() ? INVALID : _stack[_stack_head];
     ///Runs the algorithm from the given source node.
     ///This method runs the %DFS algorithm from node \c s
     ///in order to compute the DFS path to each node.
     ///The algorithm computes
     ///- the distance of each node from the root in the %DFS tree.
     ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
     ///Finds the %DFS path between \c s and \c t.
     ///This method runs the %DFS algorithm from node \c s
     ///in order to compute the DFS path to node \c t
     ///(it stops searching when \c t is processed)
     ///\return \c true if \c t is reachable form \c s.
     ///\note Apart from the return value, <tt>d.run(s,t)</tt> is
     ///just a shortcut of the following code.
     bool run(Node s,Node t) {
     ///Runs the algorithm to visit all nodes in the digraph.
     ///This method runs the %DFS algorithm in order to compute the
     ///%DFS path to each node.
     ///The algorithm computes
     ///- the %DFS tree (forest),
     ///- the distance of each node from the root(s) in the %DFS tree.
     ///\note <tt>d.run()</tt> is just a shortcut of the following code.
     ///  for (NodeIt n(digraph); n != INVALID; ++n) {
       for (NodeIt it(*G); it != INVALID; ++it) {
     ///The results of the DFS algorithm can be obtained using these
     ///Either \ref run(Node) "run()" or \ref start() should be called
     ///The DFS path to the given node.
     ///Returns the DFS path to the given node from the root(s).
     ///\warning \c t should be reached from the root(s).
     ///\pre Either \ref run(Node) "run()" or \ref init()
     ///must be called before using this function.
     Path path(Node t) const { return Path(*G, *_pred, t); }
     ///The distance of the given node from the root(s).
     ///Returns the distance of the given node from the root(s).
     ///\warning If node \c v is not reached from the root(s), then
     ///the return value of this function is undefined.
     ///\pre Either \ref run(Node) "run()" or \ref init()
     ///must be called before using this function.
     int dist(Node v) const { return (*_dist)[v]; }
     ///Returns the 'previous arc' of the %DFS tree for the given node.
     ///This function returns the 'previous arc' of the %DFS tree for the
     ///node \c v, i.e. it returns the last arc of a %DFS path from a
     ///root to \c v. It is \c INVALID if \c v is not reached from the
     ///root(s) or if \c v is a root.
     ///The %DFS tree used here is equal to the %DFS tree used in
     ///\ref predNode() and \ref predMap().
     ///\pre Either \ref run(Node) "run()" or \ref init()
     ///must be called before using this function.
     Arc predArc(Node v) const { return (*_pred)[v];}
     ///Returns the 'previous node' of the %DFS tree for the given node.
     ///This function returns the 'previous node' of the %DFS
     ///tree for the node \c v, i.e. it returns the last but one node
     ///of a %DFS path from a root to \c v. It is \c INVALID
     ///if \c v is not reached from the root(s) or if \c v is a root.
     ///The %DFS tree used here is equal to the %DFS tree used in
     ///\ref predArc() and \ref predMap().
     ///\pre Either \ref run(Node) "run()" or \ref init()
     ///must be called before using this function.
     Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
                                   G->source((*_pred)[v]); }
     ///\brief Returns a const reference to the node map that stores the
     ///distances of the nodes.
     ///Returns a const reference to the node map that stores the
     ///distances of the nodes calculated by the algorithm.
     ///\pre Either \ref run(Node) "run()" or \ref init()
     ///must be called before using this function.
     const DistMap &distMap() const { return *_dist;}
     ///\brief Returns a const reference to the node map that stores the
     ///Returns a const reference to the node map that stores the predecessor
     ///arcs, which form the DFS tree (forest).
     ///\pre Either \ref run(Node) "run()" or \ref init()
     ///must be called before using this function.
     const PredMap &predMap() const { return *_pred;}
     ///Checks if the given node. node is reached from the root(s).
     ///Returns \c true if \c v is reached from the root(s).
     ///\pre Either \ref run(Node) "run()" or \ref init()
     ///must be called before using this function.
     bool reached(Node v) const { return (*_reached)[v]; }
   ///Default traits class of dfs() function.
   ///Default traits class of dfs() function.
   ///\tparam GR Digraph type.
   struct DfsWizardDefaultTraits
     ///The type of the digraph the algorithm runs on.
     ///\brief The type of the map that stores the predecessor
     ///arcs of the %DFS paths.
     ///The type of the map that stores the predecessor
     ///arcs of the %DFS paths.
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
     ///Instantiates a PredMap.
     ///This function instantiates a PredMap.
     ///\param g is the digraph, to which we would like to define the
     static PredMap *createPredMap(const Digraph &g)
     ///The type of the map that indicates which nodes are processed.
     ///The type of the map that indicates which nodes are processed.
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     ///By default it is a NullMap.
     typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
     ///Instantiates a ProcessedMap.
     ///This function instantiates a ProcessedMap.
     ///\param g is the digraph, to which
     ///we would like to define the ProcessedMap.
     static ProcessedMap *createProcessedMap(const Digraph &g)
     static ProcessedMap *createProcessedMap(const Digraph &)
       return new ProcessedMap();
     ///The type of the map that indicates which nodes are reached.
     ///The type of the map that indicates which nodes are reached.
     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     typedef typename Digraph::template NodeMap<bool> ReachedMap;
     ///Instantiates a ReachedMap.
     ///This function instantiates a ReachedMap.
     ///\param g is the digraph, to which
     ///we would like to define the ReachedMap.
     static ReachedMap *createReachedMap(const Digraph &g)
       return new ReachedMap(g);
     ///The type of the map that stores the distances of the nodes.
     ///The type of the map that stores the distances of the nodes.
     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     typedef typename Digraph::template NodeMap<int> DistMap;
     ///Instantiates a DistMap.
     ///This function instantiates a DistMap.
     ///\param g is the digraph, to which we would like to define
     static DistMap *createDistMap(const Digraph &g)
     ///The type of the DFS paths.
     ///The type of the DFS paths.
     ///It must conform to the \ref concepts::Path "Path" concept.
     typedef lemon::Path<Digraph> Path;
   /// Default traits class used by DfsWizard
   /// Default traits class used by DfsWizard.
   /// \tparam GR The type of the digraph.
   class DfsWizardBase : public DfsWizardDefaultTraits<GR>
     typedef DfsWizardDefaultTraits<GR> Base;
     //The type of the nodes in the digraph.
     typedef typename Base::Digraph::Node Node;
     //Pointer to the digraph the algorithm runs on.
     //Pointer to the map of reached nodes.
     //Pointer to the map of processed nodes.
     //Pointer to the map of predecessors arcs.
     //Pointer to the map of distances.
     //Pointer to the DFS path to the target node.
     //Pointer to the distance of the target node.
     /// This constructor does not require parameters, it initiates
     /// all of the attributes to \c 0.
     DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
                       _dist(0), _path(0), _di(0) {}
     /// This constructor requires one parameter,
     /// others are initiated to \c 0.
     /// \param g The digraph the algorithm runs on.
     DfsWizardBase(const GR &g) :
       _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
       _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
   /// Auxiliary class for the function-type interface of DFS algorithm.
   /// This auxiliary class is created to implement the
   /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
   /// It does not have own \ref run(Node) "run()" method, it uses the
   /// functions and features of the plain \ref Dfs.
   /// This class should only be used through the \ref dfs() function,
   /// which makes it easier to use the algorithm.
   class DfsWizard : public TR
     typedef typename TR::Digraph Digraph;
     typedef typename Digraph::Node Node;
     typedef typename Digraph::NodeIt NodeIt;
     typedef typename Digraph::Arc Arc;
     typedef typename Digraph::OutArcIt OutArcIt;
     typedef typename TR::PredMap PredMap;
     typedef typename TR::DistMap DistMap;
     typedef typename TR::ReachedMap ReachedMap;
     typedef typename TR::ProcessedMap ProcessedMap;
     typedef typename TR::Path Path;
     /// Constructor that requires parameters.
     /// Constructor that requires parameters.
     /// These parameters will be the default values for the traits class.
     /// \param g The digraph the algorithm runs on.
     DfsWizard(const Digraph &g) :
     DfsWizard(const TR &b) : TR(b) {}
     ///Runs DFS algorithm from the given source node.
     ///This method runs DFS algorithm from node \c s
     ///in order to compute the DFS path to each node.
       Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
         alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
         alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
         alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
         alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
     ///Finds the DFS path between \c s and \c t.
     ///This method runs DFS algorithm from node \c s
     ///in order to compute the DFS path to node \c t
     ///(it stops searching when \c t is processed).
     ///\return \c true if \c t is reachable form \c s.
       Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
         alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
         alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
         alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
         alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
         *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
         *Base::_di = alg.dist(t);
     ///Runs DFS algorithm to visit all nodes in the digraph.
     ///This method runs DFS algorithm in order to compute
     ///the DFS path to each node.
     struct SetPredMapBase : public Base {
       static PredMap *createPredMap(const Digraph &) { return 0; };
       SetPredMapBase(const TR &b) : TR(b) {}
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" function for setting
     ///the map that stores the predecessor arcs of the nodes.
     DfsWizard<SetPredMapBase<T> > predMap(const T &t)
       Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
       return DfsWizard<SetPredMapBase<T> >(*this);
     struct SetReachedMapBase : public Base {
       static ReachedMap *createReachedMap(const Digraph &) { return 0; };
       SetReachedMapBase(const TR &b) : TR(b) {}
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" function for setting
     ///the map that indicates which nodes are reached.
     DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
       Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
       return DfsWizard<SetReachedMapBase<T> >(*this);
     struct SetDistMapBase : public Base {
       static DistMap *createDistMap(const Digraph &) { return 0; };
       SetDistMapBase(const TR &b) : TR(b) {}
     ///\brief \ref named-templ-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" function for setting
     ///the map that stores the distances of the nodes calculated
     DfsWizard<SetDistMapBase<T> > distMap(const T &t)
       Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
       return DfsWizard<SetDistMapBase<T> >(*this);
     struct SetProcessedMapBase : public Base {
       static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
       SetProcessedMapBase(const TR &b) : TR(b) {}
     ///\brief \ref named-func-param "Named parameter" for setting
     ///\ref named-templ-param "Named parameter" function for setting
     ///the map that indicates which nodes are processed.
     DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
       Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
       return DfsWizard<SetProcessedMapBase<T> >(*this);
     struct SetPathBase : public Base {
       SetPathBase(const TR &b) : TR(b) {}
     ///\brief \ref named-func-param "Named parameter"
     ///for getting the DFS path to the target node.
     ///\ref named-func-param "Named parameter"
     ///for getting the DFS path to the target node.
     DfsWizard<SetPathBase<T> > path(const T &t)
       Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
       return DfsWizard<SetPathBase<T> >(*this);
     ///\brief \ref named-func-param "Named parameter"
     ///for getting the distance of the target node.
     ///\ref named-func-param "Named parameter"
     ///for getting the distance of the target node.
     DfsWizard dist(const int &d)
       Base::_di=const_cast<int*>(&d);
   ///Function-type interface for DFS algorithm.
   ///Function-type interface for DFS algorithm.
   ///This function also has several \ref named-func-param "named parameters",
   ///they are declared as the members of class \ref DfsWizard.
   ///The following examples show how to use these parameters.
   ///  // Compute the DFS tree
   ///  dfs(g).predMap(preds).distMap(dists).run(s);
   ///  // Compute the DFS path from s to t
   ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
   ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
   ///to the end of the parameter list.
   DfsWizard<DfsWizardBase<GR> >
     return DfsWizard<DfsWizardBase<GR> >(digraph);
   /// \brief Visitor class for DFS.
   /// This class defines the interface of the DfsVisit events, and
   /// it could be the base of a real visitor class.
     typedef typename Digraph::Arc Arc;
     typedef typename Digraph::Node Node;
     /// \brief Called for the source node of the DFS.
     /// This function is called for the source node of the DFS.
     void start(const Node& node) {}
     /// \brief Called when the source node is leaved.
     /// This function is called when the source node is leaved.
     void stop(const Node& node) {}
     /// \brief Called when a node is reached first time.
     /// This function is called when a node is reached first time.
     void reach(const Node& node) {}
     /// \brief Called when an arc reaches a new node.
     /// This function is called when the DFS finds an arc whose target node
     void discover(const Arc& arc) {}
     /// \brief Called when an arc is examined but its target node is
     /// This function is called when an arc is examined but its target node is
     void examine(const Arc& arc) {}
     /// \brief Called when the DFS steps back from a node.
     /// This function is called when the DFS steps back from a node.
     void leave(const Node& node) {}
     /// \brief Called when the DFS steps back on an arc.
     /// This function is called when the DFS steps back on an arc.
     void backtrack(const Arc& arc) {}
     typedef typename Digraph::Arc Arc;
     typedef typename Digraph::Node Node;
     void start(const Node&) {}
     void stop(const Node&) {}
     void reach(const Node&) {}
     void discover(const Arc&) {}
     void examine(const Arc&) {}
     void leave(const Node&) {}
     void backtrack(const Arc&) {}
     template <typename _Visitor>
   /// \brief Default traits class of DfsVisit class.
   /// Default traits class of DfsVisit class.
   /// \tparam _Digraph The type of the digraph the algorithm runs on.
   struct DfsVisitDefaultTraits {
     /// \brief The type of the digraph the algorithm runs on.
     /// \brief The type of the map that indicates which nodes are reached.
     /// The type of the map that indicates which nodes are reached.
     /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     typedef typename Digraph::template NodeMap<bool> ReachedMap;
     /// \brief Instantiates a ReachedMap.
     /// This function instantiates a ReachedMap.
     /// \param digraph is the digraph, to which
     /// we would like to define the ReachedMap.
     static ReachedMap *createReachedMap(const Digraph &digraph) {
       return new ReachedMap(digraph);
   /// \brief DFS algorithm class with visitor interface.
   /// This class provides an efficient implementation of the DFS algorithm
   /// with visitor interface.
   /// The DfsVisit class provides an alternative interface to the Dfs
   /// class. It works with callback mechanism, the DfsVisit object calls
   /// the member functions of the \c Visitor class on every DFS event.
   /// This interface of the DFS algorithm should be used in special cases
   /// when extra actions have to be performed in connection with certain
   /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
   /// \tparam GR The type of the digraph the algorithm runs on.
   /// The default type is \ref ListDigraph.
   /// The value of GR is not used directly by \ref DfsVisit,
   /// it is only passed to \ref DfsVisitDefaultTraits.
   /// \tparam VS The Visitor type that is used by the algorithm.
   /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
   /// does not observe the DFS events. If you want to observe the DFS
   /// events, you should implement your own visitor class.
   /// \tparam TR Traits class to set various data types used by the
   /// algorithm. The default traits class is
   /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
   /// See \ref DfsVisitDefaultTraits for the documentation of
   /// a DFS visit traits class.
   template <typename GR, typename VS, typename TR>
   template <typename GR = ListDigraph,
             typename VS = DfsVisitor<GR>,
             typename TR = DfsVisitDefaultTraits<GR> >
     ///The type of the digraph the algorithm runs on.
     typedef typename Traits::Digraph Digraph;
     ///The visitor type used by the algorithm.
     ///The type of the map that indicates which nodes are reached.
     typedef typename Traits::ReachedMap ReachedMap;
     typedef typename Digraph::Node Node;
     typedef typename Digraph::NodeIt NodeIt;
     typedef typename Digraph::Arc Arc;
     typedef typename Digraph::OutArcIt OutArcIt;
     //Pointer to the underlying digraph.
     //Pointer to the visitor object.
     //Pointer to the map of reached status of the nodes.
     //Indicates if _reached is locally allocated (true) or not.
     std::vector<typename Digraph::Arc> _stack;
     //Creates the maps if necessary.
         _reached = Traits::createReachedMap(*_digraph);
     /// \name Named Template Parameters
     struct SetReachedMapTraits : public Traits {
       static ReachedMap *createReachedMap(const Digraph &digraph) {
         LEMON_ASSERT(false, "ReachedMap is not initialized");
         return 0; // ignore warnings
     /// \brief \ref named-templ-param "Named parameter" for setting
     /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
     struct SetReachedMap : public DfsVisit< Digraph, Visitor,
                                             SetReachedMapTraits<T> > {
       typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
     /// \param digraph The digraph the algorithm runs on.
     /// \param visitor The visitor object of the algorithm.
     DfsVisit(const Digraph& digraph, Visitor& visitor)
       : _digraph(&digraph), _visitor(&visitor),
         _reached(0), local_reached(false) {}
       if(local_reached) delete _reached;
     /// \brief Sets the map that indicates which nodes are reached.
     /// Sets the map that indicates which nodes are reached.
     /// If you don't use this function before calling \ref run(Node) "run()"
     /// or \ref init(), an instance will be allocated automatically.
     /// The destructor deallocates this automatically allocated map,
     /// \return <tt> (*this) </tt>
     DfsVisit &reachedMap(ReachedMap &m) {
     /// \name Execution Control
     /// The simplest way to execute the DFS algorithm is to use one of the
     /// member functions called \ref run(Node) "run()".\n
     /// If you need better control on the execution, you have to call
     /// \ref init() first, then you can add a source node with \ref addSource()
     /// and perform the actual computation with \ref start().
     /// This procedure can be repeated if there are nodes that have not
     /// \brief Initializes the internal data structures.
     /// Initializes the internal data structures.
       _stack.resize(countNodes(*_digraph));
       for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
     /// \brief Adds a new source node.
     /// Adds a new source node to the set of nodes to be processed.
     /// \pre The stack must be empty. Otherwise the algorithm gives
     /// wrong results. (One of the outgoing arcs of all the source nodes
     /// except for the last one will not be visited and distances will
       LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
           _digraph->firstOut(e, s);
             _stack[++_stack_head] = e;
     /// \brief Processes the next arc.
     /// Processes the next arc.
     /// \return The processed arc.
     /// \pre The stack must not be empty.
       Arc e = _stack[_stack_head];
       Node m = _digraph->target(e);
         _digraph->firstOut(_stack[++_stack_head], m);
         _digraph->nextOut(_stack[_stack_head]);
       while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
           _visitor->backtrack(_stack[_stack_head]);
           m = _digraph->source(_stack[_stack_head]);
           _digraph->nextOut(_stack[_stack_head]);
     /// \brief Next arc to be processed.
     /// Next arc to be processed.
     /// \return The next arc to be processed or INVALID if the stack is
       return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
     /// \brief Returns \c false if there are nodes
     /// Returns \c false if there are nodes
     /// to be processed in the queue (stack).
     bool emptyQueue() const { return _stack_head < 0; }
     /// \brief Returns the number of the nodes to be processed.
     /// Returns the number of the nodes to be processed in the queue (stack).
     int queueSize() const { return _stack_head + 1; }
     /// \brief Executes the algorithm.
     /// Executes the algorithm.
     /// This method runs the %DFS algorithm from the root node
     /// in order to compute the %DFS path to each node.
     /// The algorithm computes
     /// - the distance of each node from the root in the %DFS tree.
     /// \pre init() must be called and a root node should be
     /// added with addSource() before using this function.
     /// \note <tt>d.start()</tt> is just a shortcut of the following code.
     ///   while ( !d.emptyQueue() ) {
       while ( !emptyQueue() ) processNextArc();
     /// \brief Executes the algorithm until the given target node is reached.
     /// Executes the algorithm until the given target node is reached.
     /// This method runs the %DFS algorithm from the root node
     /// in order to compute the DFS path to \c t.
     /// The algorithm computes
     /// - the %DFS path to \c t,
     /// - the distance of \c t from the root in the %DFS tree.
     /// \pre init() must be called and a root node should be added
     /// with addSource() before using this function.
       while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
     /// \brief Executes the algorithm until a condition is met.
     /// Executes the algorithm until a condition is met.
     /// This method runs the %DFS algorithm from the root node
     /// until an arc \c a with <tt>am[a]</tt> true is found.
     /// \param am A \c bool (or convertible) arc map. The algorithm
     /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
     /// \return The reached arc \c a with <tt>am[a]</tt> true or
     /// \c INVALID if no such arc was found.
     /// \pre init() must be called and a root node should be added
     /// with addSource() before using this function.
     /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
     Arc start(const AM &am) {
       while ( !emptyQueue() && !am[_stack[_stack_head]] )
       return emptyQueue() ? INVALID : _stack[_stack_head];
     /// \brief Runs the algorithm from the given source node.
     /// This method runs the %DFS algorithm from node \c s.
     /// in order to compute the DFS path to each node.
     /// The algorithm computes
     /// - the distance of each node from the root in the %DFS tree.
     /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
     /// \brief Finds the %DFS path between \c s and \c t.
     /// This method runs the %DFS algorithm from node \c s
     /// in order to compute the DFS path to node \c t
     /// (it stops searching when \c t is processed).
     /// \return \c true if \c t is reachable form \c s.
     /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
     /// just a shortcut of the following code.
     bool run(Node s,Node t) {
     /// \brief Runs the algorithm to visit all nodes in the digraph.
     /// This method runs the %DFS algorithm in order to
     /// compute the %DFS path to each node.
     /// The algorithm computes
     /// - the %DFS tree (forest),
     /// - the distance of each node from the root(s) in the %DFS tree.
     /// \note <tt>d.run()</tt> is just a shortcut of the following code.
     ///   for (NodeIt n(digraph); n != INVALID; ++n) {
       for (NodeIt it(*_digraph); it != INVALID; ++it) {
     /// \name Query Functions
     /// The results of the DFS algorithm can be obtained using these
     /// Either \ref run(Node) "run()" or \ref start() should be called
     /// \brief Checks if the given node is reached from the root(s).
     /// Returns \c true if \c v is reached from the root(s).
     /// \pre Either \ref run(Node) "run()" or \ref init()
     /// must be called before using this function.
     bool reached(Node v) const { return (*_reached)[v]; }
 } //END OF NAMESPACE LEMON