1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
24 ///\brief DFS algorithm.
26 #include <lemon/list_graph.h>
27 #include <lemon/bits/path_dump.h>
28 #include <lemon/core.h>
29 #include <lemon/error.h>
30 #include <lemon/maps.h>
31 #include <lemon/path.h>
35 ///Default traits class of Dfs class.
37 ///Default traits class of Dfs class.
38 ///\tparam GR Digraph type.
40 struct DfsDefaultTraits
42 ///The type of the digraph the algorithm runs on.
45 ///\brief The type of the map that stores the predecessor
46 ///arcs of the %DFS paths.
48 ///The type of the map that stores the predecessor
49 ///arcs of the %DFS paths.
50 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
51 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 ///Instantiates a PredMap.
54 ///This function instantiates a PredMap.
55 ///\param g is the digraph, to which we would like to define the
57 static PredMap *createPredMap(const Digraph &g)
59 return new PredMap(g);
62 ///The type of the map that indicates which nodes are processed.
64 ///The type of the map that indicates which nodes are processed.
65 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
66 typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 ///Instantiates a ProcessedMap.
69 ///This function instantiates a ProcessedMap.
70 ///\param g is the digraph, to which
71 ///we would like to define the ProcessedMap
73 static ProcessedMap *createProcessedMap(const Digraph &g)
75 static ProcessedMap *createProcessedMap(const Digraph &)
78 return new ProcessedMap();
81 ///The type of the map that indicates which nodes are reached.
83 ///The type of the map that indicates which nodes are reached.
84 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 ///Instantiates a ReachedMap.
88 ///This function instantiates a ReachedMap.
89 ///\param g is the digraph, to which
90 ///we would like to define the ReachedMap.
91 static ReachedMap *createReachedMap(const Digraph &g)
93 return new ReachedMap(g);
96 ///The type of the map that stores the distances of the nodes.
98 ///The type of the map that stores the distances of the nodes.
99 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100 typedef typename Digraph::template NodeMap<int> DistMap;
101 ///Instantiates a DistMap.
103 ///This function instantiates a DistMap.
104 ///\param g is the digraph, to which we would like to define the
106 static DistMap *createDistMap(const Digraph &g)
108 return new DistMap(g);
112 ///%DFS algorithm class.
115 ///This class provides an efficient implementation of the %DFS algorithm.
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
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
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.
130 template <typename GR,
133 template <typename GR=ListDigraph,
134 typename TR=DfsDefaultTraits<GR> >
139 ///The type of the digraph the algorithm runs on.
140 typedef typename TR::Digraph Digraph;
142 ///\brief The type of the map that stores the predecessor arcs of the
144 typedef typename TR::PredMap PredMap;
145 ///The type of the map that stores the distances of the nodes.
146 typedef typename TR::DistMap DistMap;
147 ///The type of the map that indicates which nodes are reached.
148 typedef typename TR::ReachedMap ReachedMap;
149 ///The type of the map that indicates which nodes are processed.
150 typedef typename TR::ProcessedMap ProcessedMap;
151 ///The type of the paths.
152 typedef PredMapPath<Digraph, PredMap> Path;
159 typedef typename Digraph::Node Node;
160 typedef typename Digraph::NodeIt NodeIt;
161 typedef typename Digraph::Arc Arc;
162 typedef typename Digraph::OutArcIt OutArcIt;
164 //Pointer to the underlying digraph.
166 //Pointer to the map of predecessor arcs.
168 //Indicates if _pred is locally allocated (true) or not.
170 //Pointer to the map of distances.
172 //Indicates if _dist is locally allocated (true) or not.
174 //Pointer to the map of reached status of the nodes.
175 ReachedMap *_reached;
176 //Indicates if _reached is locally allocated (true) or not.
178 //Pointer to the map of processed status of the nodes.
179 ProcessedMap *_processed;
180 //Indicates if _processed is locally allocated (true) or not.
181 bool local_processed;
183 std::vector<typename Digraph::OutArcIt> _stack;
186 //Creates the maps if necessary.
191 _pred = Traits::createPredMap(*G);
195 _dist = Traits::createDistMap(*G);
198 local_reached = true;
199 _reached = Traits::createReachedMap(*G);
202 local_processed = true;
203 _processed = Traits::createProcessedMap(*G);
215 ///\name Named template parameters
220 struct SetPredMapTraits : public Traits {
222 static PredMap *createPredMap(const Digraph &)
224 LEMON_ASSERT(false, "PredMap is not initialized");
225 return 0; // ignore warnings
228 ///\brief \ref named-templ-param "Named parameter" for setting
231 ///\ref named-templ-param "Named parameter" for setting
234 struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
235 typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
239 struct SetDistMapTraits : public Traits {
241 static DistMap *createDistMap(const Digraph &)
243 LEMON_ASSERT(false, "DistMap is not initialized");
244 return 0; // ignore warnings
247 ///\brief \ref named-templ-param "Named parameter" for setting
250 ///\ref named-templ-param "Named parameter" for setting
253 struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
254 typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
258 struct SetReachedMapTraits : public Traits {
259 typedef T ReachedMap;
260 static ReachedMap *createReachedMap(const Digraph &)
262 LEMON_ASSERT(false, "ReachedMap is not initialized");
263 return 0; // ignore warnings
266 ///\brief \ref named-templ-param "Named parameter" for setting
269 ///\ref named-templ-param "Named parameter" for setting
272 struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
273 typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
277 struct SetProcessedMapTraits : public Traits {
278 typedef T ProcessedMap;
279 static ProcessedMap *createProcessedMap(const Digraph &)
281 LEMON_ASSERT(false, "ProcessedMap is not initialized");
282 return 0; // ignore warnings
285 ///\brief \ref named-templ-param "Named parameter" for setting
286 ///ProcessedMap type.
288 ///\ref named-templ-param "Named parameter" for setting
289 ///ProcessedMap type.
291 struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
292 typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
295 struct SetStandardProcessedMapTraits : public Traits {
296 typedef typename Digraph::template NodeMap<bool> ProcessedMap;
297 static ProcessedMap *createProcessedMap(const Digraph &g)
299 return new ProcessedMap(g);
302 ///\brief \ref named-templ-param "Named parameter" for setting
303 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305 ///\ref named-templ-param "Named parameter" for setting
306 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
307 ///If you don't set it explicitly, it will be automatically allocated.
308 struct SetStandardProcessedMap :
309 public Dfs< Digraph, SetStandardProcessedMapTraits > {
310 typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
320 ///\param g The digraph the algorithm runs on.
321 Dfs(const Digraph &g) :
323 _pred(NULL), local_pred(false),
324 _dist(NULL), local_dist(false),
325 _reached(NULL), local_reached(false),
326 _processed(NULL), local_processed(false)
332 if(local_pred) delete _pred;
333 if(local_dist) delete _dist;
334 if(local_reached) delete _reached;
335 if(local_processed) delete _processed;
338 ///Sets the map that stores the predecessor arcs.
340 ///Sets the map that stores the predecessor arcs.
341 ///If you don't use this function before calling \ref run(),
342 ///it will allocate one. The destructor deallocates this
343 ///automatically allocated map, of course.
344 ///\return <tt> (*this) </tt>
345 Dfs &predMap(PredMap &m)
355 ///Sets the map that indicates which nodes are reached.
357 ///Sets the map that indicates which nodes are reached.
358 ///If you don't use this function before calling \ref run(),
359 ///it will allocate one. The destructor deallocates this
360 ///automatically allocated map, of course.
361 ///\return <tt> (*this) </tt>
362 Dfs &reachedMap(ReachedMap &m)
372 ///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(),
376 ///it will allocate one. The destructor deallocates this
377 ///automatically allocated map, of course.
378 ///\return <tt> (*this) </tt>
379 Dfs &processedMap(ProcessedMap &m)
381 if(local_processed) {
383 local_processed=false;
389 ///Sets the map that stores the distances of the nodes.
391 ///Sets the map that stores the distances of the nodes calculated by
393 ///If you don't use this function before calling \ref run(),
394 ///it will allocate one. The destructor deallocates this
395 ///automatically allocated map, of course.
396 ///\return <tt> (*this) </tt>
397 Dfs &distMap(DistMap &m)
409 ///\name Execution control
410 ///The simplest way to execute the algorithm is to use
411 ///one of the member functions called \ref lemon::Dfs::run() "run()".
413 ///If you need more control on the execution, first you must call
414 ///\ref lemon::Dfs::init() "init()", then you can add a source node
415 ///with \ref lemon::Dfs::addSource() "addSource()".
416 ///Finally \ref lemon::Dfs::start() "start()" will perform the
417 ///actual path computation.
421 ///Initializes the internal data structures.
423 ///Initializes the internal data structures.
428 _stack.resize(countNodes(*G));
430 for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
431 _pred->set(u,INVALID);
432 _reached->set(u,false);
433 _processed->set(u,false);
437 ///Adds a new source node.
439 ///Adds a new source node to the set of nodes to be processed.
441 ///\pre The stack must be empty. (Otherwise the algorithm gives
444 ///\warning Distances will be wrong (or at least strange) in case of
446 void addSource(Node s)
448 LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
451 _reached->set(s,true);
452 _pred->set(s,INVALID);
455 _stack[++_stack_head]=e;
456 _dist->set(s,_stack_head);
459 _processed->set(s,true);
465 ///Processes the next arc.
467 ///Processes the next arc.
469 ///\return The processed arc.
471 ///\pre The stack must not be empty.
475 Arc e=_stack[_stack_head];
476 if(!(*_reached)[m=G->target(e)]) {
478 _reached->set(m,true);
480 _stack[_stack_head] = OutArcIt(*G, m);
481 _dist->set(m,_stack_head);
485 ++_stack[_stack_head];
487 while(_stack_head>=0 && _stack[_stack_head]==INVALID) {
488 _processed->set(m,true);
491 m=G->source(_stack[_stack_head]);
492 ++_stack[_stack_head];
498 ///Next arc to be processed.
500 ///Next arc to be processed.
502 ///\return The next arc to be processed or \c INVALID if the stack
504 OutArcIt nextArc() const
506 return _stack_head>=0?_stack[_stack_head]:INVALID;
509 ///\brief Returns \c false if there are nodes
512 ///Returns \c false if there are nodes
513 ///to be processed in the queue (stack).
514 bool emptyQueue() const { return _stack_head<0; }
516 ///Returns the number of the nodes to be processed.
518 ///Returns the number of the nodes to be processed in the queue (stack).
519 int queueSize() const { return _stack_head+1; }
521 ///Executes the algorithm.
523 ///Executes the algorithm.
525 ///This method runs the %DFS algorithm from the root node
526 ///in order to compute the DFS path to each node.
528 /// The algorithm computes
530 ///- the distance of each node from the root in the %DFS tree.
532 ///\pre init() must be called and a root node should be
533 ///added with addSource() before using this function.
535 ///\note <tt>d.start()</tt> is just a shortcut of the following code.
537 /// while ( !d.emptyQueue() ) {
538 /// d.processNextArc();
543 while ( !emptyQueue() ) processNextArc();
546 ///Executes the algorithm until the given target node is reached.
548 ///Executes the algorithm until the given target node is reached.
550 ///This method runs the %DFS algorithm from the root node
551 ///in order to compute the DFS path to \c t.
553 ///The algorithm computes
554 ///- the %DFS path to \c t,
555 ///- the distance of \c t from the root in the %DFS tree.
557 ///\pre init() must be called and a root node should be
558 ///added with addSource() before using this function.
561 while ( !emptyQueue() && G->target(_stack[_stack_head])!=t )
565 ///Executes the algorithm until a condition is met.
567 ///Executes the algorithm until a condition is met.
569 ///This method runs the %DFS algorithm from the root node
570 ///until an arc \c a with <tt>am[a]</tt> true is found.
572 ///\param am A \c bool (or convertible) arc map. The algorithm
573 ///will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
575 ///\return The reached arc \c a with <tt>am[a]</tt> true or
576 ///\c INVALID if no such arc was found.
578 ///\pre init() must be called and a root node should be
579 ///added with addSource() before using this function.
581 ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
583 template<class ArcBoolMap>
584 Arc start(const ArcBoolMap &am)
586 while ( !emptyQueue() && !am[_stack[_stack_head]] )
588 return emptyQueue() ? INVALID : _stack[_stack_head];
591 ///Runs the algorithm from the given source node.
593 ///This method runs the %DFS algorithm from node \c s
594 ///in order to compute the DFS path to each node.
596 ///The algorithm computes
598 ///- the distance of each node from the root in the %DFS tree.
600 ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
612 ///Finds the %DFS path between \c s and \c t.
614 ///This method runs the %DFS algorithm from node \c s
615 ///in order to compute the DFS path to node \c t
616 ///(it stops searching when \c t is processed)
618 ///\return \c true if \c t is reachable form \c s.
620 ///\note Apart from the return value, <tt>d.run(s,t)</tt> is
621 ///just a shortcut of the following code.
627 bool run(Node s,Node t) {
634 ///Runs the algorithm to visit all nodes in the digraph.
636 ///This method runs the %DFS algorithm in order to compute the
637 ///%DFS path to each node.
639 ///The algorithm computes
641 ///- the distance of each node from the root in the %DFS tree.
643 ///\note <tt>d.run()</tt> is just a shortcut of the following code.
646 /// for (NodeIt n(digraph); n != INVALID; ++n) {
647 /// if (!d.reached(n)) {
655 for (NodeIt it(*G); it != INVALID; ++it) {
665 ///\name Query Functions
666 ///The result of the %DFS algorithm can be obtained using these
668 ///Either \ref lemon::Dfs::run() "run()" or \ref lemon::Dfs::start()
669 ///"start()" must be called before using them.
673 ///The DFS path to a node.
675 ///Returns the DFS path to a node.
677 ///\warning \c t should be reachable from the root.
679 ///\pre Either \ref run() or \ref start() must be called before
680 ///using this function.
681 Path path(Node t) const { return Path(*G, *_pred, t); }
683 ///The distance of a node from the root.
685 ///Returns the distance of a node from the root.
687 ///\warning If node \c v is not reachable from the root, then
688 ///the return value of this function is undefined.
690 ///\pre Either \ref run() or \ref start() must be called before
691 ///using this function.
692 int dist(Node v) const { return (*_dist)[v]; }
694 ///Returns the 'previous arc' of the %DFS tree for a node.
696 ///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
698 ///root to \c v. It is \c INVALID
699 ///if \c v is not reachable from the root(s) or if \c v is a root.
701 ///The %DFS tree used here is equal to the %DFS tree used in
704 ///\pre Either \ref run() or \ref start() must be called before using
706 Arc predArc(Node v) const { return (*_pred)[v];}
708 ///Returns the 'previous node' of the %DFS tree.
710 ///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
712 ///from a %DFS path from the 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.
715 ///The %DFS tree used here is equal to the %DFS tree used in
718 ///\pre Either \ref run() or \ref start() must be called before
719 ///using this function.
720 Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
721 G->source((*_pred)[v]); }
723 ///\brief Returns a const reference to the node map that stores the
724 ///distances of the nodes.
726 ///Returns a const reference to the node map that stores the
727 ///distances of the nodes calculated by the algorithm.
729 ///\pre Either \ref run() or \ref init()
730 ///must be called before using this function.
731 const DistMap &distMap() const { return *_dist;}
733 ///\brief Returns a const reference to the node map that stores the
736 ///Returns a const reference to the node map that stores the predecessor
737 ///arcs, which form the DFS tree.
739 ///\pre Either \ref run() or \ref init()
740 ///must be called before using this function.
741 const PredMap &predMap() const { return *_pred;}
743 ///Checks if a node is reachable from the root(s).
745 ///Returns \c true if \c v is reachable from the root(s).
746 ///\pre Either \ref run() or \ref start()
747 ///must be called before using this function.
748 bool reached(Node v) const { return (*_reached)[v]; }
753 ///Default traits class of dfs() function.
755 ///Default traits class of dfs() function.
756 ///\tparam GR Digraph type.
758 struct DfsWizardDefaultTraits
760 ///The type of the digraph the algorithm runs on.
763 ///\brief The type of the map that stores the predecessor
764 ///arcs of the %DFS paths.
766 ///The type of the map that stores the predecessor
767 ///arcs of the %DFS paths.
768 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
769 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
770 ///Instantiates a PredMap.
772 ///This function instantiates a PredMap.
773 ///\param g is the digraph, to which we would like to define the
775 static PredMap *createPredMap(const Digraph &g)
777 return new PredMap(g);
780 ///The type of the map that indicates which nodes are processed.
782 ///The type of the map that indicates which nodes are processed.
783 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
784 ///By default it is a NullMap.
785 typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
786 ///Instantiates a ProcessedMap.
788 ///This function instantiates a ProcessedMap.
789 ///\param g is the digraph, to which
790 ///we would like to define the ProcessedMap.
792 static ProcessedMap *createProcessedMap(const Digraph &g)
794 static ProcessedMap *createProcessedMap(const Digraph &)
797 return new ProcessedMap();
800 ///The type of the map that indicates which nodes are reached.
802 ///The type of the map that indicates which nodes are reached.
803 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804 typedef typename Digraph::template NodeMap<bool> ReachedMap;
805 ///Instantiates a ReachedMap.
807 ///This function instantiates a ReachedMap.
808 ///\param g is the digraph, to which
809 ///we would like to define the ReachedMap.
810 static ReachedMap *createReachedMap(const Digraph &g)
812 return new ReachedMap(g);
815 ///The type of the map that stores the distances of the nodes.
817 ///The type of the map that stores the distances of the nodes.
818 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
819 typedef typename Digraph::template NodeMap<int> DistMap;
820 ///Instantiates a DistMap.
822 ///This function instantiates a DistMap.
823 ///\param g is the digraph, to which we would like to define
825 static DistMap *createDistMap(const Digraph &g)
827 return new DistMap(g);
830 ///The type of the DFS paths.
832 ///The type of the DFS paths.
833 ///It must meet the \ref concepts::Path "Path" concept.
834 typedef lemon::Path<Digraph> Path;
837 /// Default traits class used by DfsWizard
839 /// To make it easier to use Dfs algorithm
840 /// we have created a wizard class.
841 /// This \ref DfsWizard class needs default traits,
842 /// as well as the \ref Dfs class.
843 /// The \ref DfsWizardBase is a class to be the default traits of the
844 /// \ref DfsWizard class.
846 class DfsWizardBase : public DfsWizardDefaultTraits<GR>
849 typedef DfsWizardDefaultTraits<GR> Base;
851 //The type of the nodes in the digraph.
852 typedef typename Base::Digraph::Node Node;
854 //Pointer to the digraph the algorithm runs on.
856 //Pointer to the map of reached nodes.
858 //Pointer to the map of processed nodes.
860 //Pointer to the map of predecessors arcs.
862 //Pointer to the map of distances.
864 //Pointer to the DFS path to the target node.
866 //Pointer to the distance of the target node.
872 /// This constructor does not require parameters, therefore it initiates
873 /// all of the attributes to \c 0.
874 DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
875 _dist(0), _path(0), _di(0) {}
879 /// This constructor requires one parameter,
880 /// others are initiated to \c 0.
881 /// \param g The digraph the algorithm runs on.
882 DfsWizardBase(const GR &g) :
883 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
884 _reached(0), _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
888 /// Auxiliary class for the function-type interface of DFS algorithm.
890 /// This auxiliary class is created to implement the
891 /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
892 /// It does not have own \ref run() method, it uses the functions
893 /// and features of the plain \ref Dfs.
895 /// This class should only be used through the \ref dfs() function,
896 /// which makes it easier to use the algorithm.
898 class DfsWizard : public TR
902 ///The type of the digraph the algorithm runs on.
903 typedef typename TR::Digraph Digraph;
905 typedef typename Digraph::Node Node;
906 typedef typename Digraph::NodeIt NodeIt;
907 typedef typename Digraph::Arc Arc;
908 typedef typename Digraph::OutArcIt OutArcIt;
910 ///\brief The type of the map that stores the predecessor
911 ///arcs of the DFS paths.
912 typedef typename TR::PredMap PredMap;
913 ///\brief The type of the map that stores the distances of the nodes.
914 typedef typename TR::DistMap DistMap;
915 ///\brief The type of the map that indicates which nodes are reached.
916 typedef typename TR::ReachedMap ReachedMap;
917 ///\brief The type of the map that indicates which nodes are processed.
918 typedef typename TR::ProcessedMap ProcessedMap;
919 ///The type of the DFS paths
920 typedef typename TR::Path Path;
925 DfsWizard() : TR() {}
927 /// Constructor that requires parameters.
929 /// Constructor that requires parameters.
930 /// These parameters will be the default values for the traits class.
931 /// \param g The digraph the algorithm runs on.
932 DfsWizard(const Digraph &g) :
936 DfsWizard(const TR &b) : TR(b) {}
940 ///Runs DFS algorithm from the given source node.
942 ///This method runs DFS algorithm from node \c s
943 ///in order to compute the DFS path to each node.
946 Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
948 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
950 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
952 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
953 if (Base::_processed)
954 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
961 ///Finds the DFS path between \c s and \c t.
963 ///This method runs DFS algorithm from node \c s
964 ///in order to compute the DFS path to node \c t
965 ///(it stops searching when \c t is processed).
967 ///\return \c true if \c t is reachable form \c s.
968 bool run(Node s, Node t)
970 Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
972 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
974 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
976 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
977 if (Base::_processed)
978 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
981 *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
983 *Base::_di = alg.dist(t);
984 return alg.reached(t);
987 ///Runs DFS algorithm to visit all nodes in the digraph.
989 ///This method runs DFS algorithm in order to compute
990 ///the DFS path to each node.
997 struct SetPredMapBase : public Base {
999 static PredMap *createPredMap(const Digraph &) { return 0; };
1000 SetPredMapBase(const TR &b) : TR(b) {}
1002 ///\brief \ref named-func-param "Named parameter"
1003 ///for setting PredMap object.
1005 ///\ref named-func-param "Named parameter"
1006 ///for setting PredMap object.
1008 DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1010 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1011 return DfsWizard<SetPredMapBase<T> >(*this);
1015 struct SetReachedMapBase : public Base {
1016 typedef T ReachedMap;
1017 static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1018 SetReachedMapBase(const TR &b) : TR(b) {}
1020 ///\brief \ref named-func-param "Named parameter"
1021 ///for setting ReachedMap object.
1023 /// \ref named-func-param "Named parameter"
1024 ///for setting ReachedMap object.
1026 DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1028 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1029 return DfsWizard<SetReachedMapBase<T> >(*this);
1033 struct SetDistMapBase : public Base {
1035 static DistMap *createDistMap(const Digraph &) { return 0; };
1036 SetDistMapBase(const TR &b) : TR(b) {}
1038 ///\brief \ref named-func-param "Named parameter"
1039 ///for setting DistMap object.
1041 /// \ref named-func-param "Named parameter"
1042 ///for setting DistMap object.
1044 DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1046 Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1047 return DfsWizard<SetDistMapBase<T> >(*this);
1051 struct SetProcessedMapBase : public Base {
1052 typedef T ProcessedMap;
1053 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1054 SetProcessedMapBase(const TR &b) : TR(b) {}
1056 ///\brief \ref named-func-param "Named parameter"
1057 ///for setting ProcessedMap object.
1059 /// \ref named-func-param "Named parameter"
1060 ///for setting ProcessedMap object.
1062 DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1064 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1065 return DfsWizard<SetProcessedMapBase<T> >(*this);
1069 struct SetPathBase : public Base {
1071 SetPathBase(const TR &b) : TR(b) {}
1073 ///\brief \ref named-func-param "Named parameter"
1074 ///for getting the DFS path to the target node.
1076 ///\ref named-func-param "Named parameter"
1077 ///for getting the DFS path to the target node.
1079 DfsWizard<SetPathBase<T> > path(const T &t)
1081 Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1082 return DfsWizard<SetPathBase<T> >(*this);
1085 ///\brief \ref named-func-param "Named parameter"
1086 ///for getting the distance of the target node.
1088 ///\ref named-func-param "Named parameter"
1089 ///for getting the distance of the target node.
1090 DfsWizard dist(const int &d)
1092 Base::_di=const_cast<int*>(&d);
1098 ///Function-type interface for DFS algorithm.
1101 ///Function-type interface for DFS algorithm.
1103 ///This function also has several \ref named-func-param "named parameters",
1104 ///they are declared as the members of class \ref DfsWizard.
1105 ///The following examples show how to use these parameters.
1107 /// // Compute the DFS tree
1108 /// dfs(g).predMap(preds).distMap(dists).run(s);
1110 /// // Compute the DFS path from s to t
1111 /// bool reached = dfs(g).path(p).dist(d).run(s,t);
1114 ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
1115 ///to the end of the parameter list.
1119 DfsWizard<DfsWizardBase<GR> >
1120 dfs(const GR &digraph)
1122 return DfsWizard<DfsWizardBase<GR> >(digraph);
1126 /// \brief Visitor class for DFS.
1128 /// This class defines the interface of the DfsVisit events, and
1129 /// it could be the base of a real visitor class.
1130 template <typename _Digraph>
1132 typedef _Digraph Digraph;
1133 typedef typename Digraph::Arc Arc;
1134 typedef typename Digraph::Node Node;
1135 /// \brief Called for the source node of the DFS.
1137 /// This function is called for the source node of the DFS.
1138 void start(const Node& node) {}
1139 /// \brief Called when the source node is leaved.
1141 /// This function is called when the source node is leaved.
1142 void stop(const Node& node) {}
1143 /// \brief Called when a node is reached first time.
1145 /// This function is called when a node is reached first time.
1146 void reach(const Node& node) {}
1147 /// \brief Called when an arc reaches a new node.
1149 /// This function is called when the DFS finds an arc whose target node
1150 /// is not reached yet.
1151 void discover(const Arc& arc) {}
1152 /// \brief Called when an arc is examined but its target node is
1153 /// already discovered.
1155 /// This function is called when an arc is examined but its target node is
1156 /// already discovered.
1157 void examine(const Arc& arc) {}
1158 /// \brief Called when the DFS steps back from a node.
1160 /// This function is called when the DFS steps back from a node.
1161 void leave(const Node& node) {}
1162 /// \brief Called when the DFS steps back on an arc.
1164 /// This function is called when the DFS steps back on an arc.
1165 void backtrack(const Arc& arc) {}
1168 template <typename _Digraph>
1170 typedef _Digraph Digraph;
1171 typedef typename Digraph::Arc Arc;
1172 typedef typename Digraph::Node Node;
1173 void start(const Node&) {}
1174 void stop(const Node&) {}
1175 void reach(const Node&) {}
1176 void discover(const Arc&) {}
1177 void examine(const Arc&) {}
1178 void leave(const Node&) {}
1179 void backtrack(const Arc&) {}
1181 template <typename _Visitor>
1182 struct Constraints {
1183 void constraints() {
1186 visitor.start(node);
1188 visitor.reach(node);
1189 visitor.discover(arc);
1190 visitor.examine(arc);
1191 visitor.leave(node);
1192 visitor.backtrack(arc);
1199 /// \brief Default traits class of DfsVisit class.
1201 /// Default traits class of DfsVisit class.
1202 /// \tparam _Digraph The type of the digraph the algorithm runs on.
1203 template<class _Digraph>
1204 struct DfsVisitDefaultTraits {
1206 /// \brief The type of the digraph the algorithm runs on.
1207 typedef _Digraph Digraph;
1209 /// \brief The type of the map that indicates which nodes are reached.
1211 /// The type of the map that indicates which nodes are reached.
1212 /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1213 typedef typename Digraph::template NodeMap<bool> ReachedMap;
1215 /// \brief Instantiates a ReachedMap.
1217 /// This function instantiates a ReachedMap.
1218 /// \param digraph is the digraph, to which
1219 /// we would like to define the ReachedMap.
1220 static ReachedMap *createReachedMap(const Digraph &digraph) {
1221 return new ReachedMap(digraph);
1228 /// \brief %DFS algorithm class with visitor interface.
1230 /// This class provides an efficient implementation of the %DFS algorithm
1231 /// with visitor interface.
1233 /// The %DfsVisit class provides an alternative interface to the Dfs
1234 /// class. It works with callback mechanism, the DfsVisit object calls
1235 /// the member functions of the \c Visitor class on every DFS event.
1237 /// This interface of the DFS algorithm should be used in special cases
1238 /// when extra actions have to be performed in connection with certain
1239 /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1242 /// \tparam _Digraph The type of the digraph the algorithm runs on.
1243 /// The default value is
1244 /// \ref ListDigraph. The value of _Digraph is not used directly by
1245 /// \ref DfsVisit, it is only passed to \ref DfsVisitDefaultTraits.
1246 /// \tparam _Visitor The Visitor type that is used by the algorithm.
1247 /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty visitor, which
1248 /// does not observe the DFS events. If you want to observe the DFS
1249 /// events, you should implement your own visitor class.
1250 /// \tparam _Traits Traits class to set various data types used by the
1251 /// algorithm. The default traits class is
1252 /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>".
1253 /// See \ref DfsVisitDefaultTraits for the documentation of
1254 /// a DFS visit traits class.
1256 template <typename _Digraph, typename _Visitor, typename _Traits>
1258 template <typename _Digraph = ListDigraph,
1259 typename _Visitor = DfsVisitor<_Digraph>,
1260 typename _Traits = DfsVisitDefaultTraits<_Digraph> >
1265 ///The traits class.
1266 typedef _Traits Traits;
1268 ///The type of the digraph the algorithm runs on.
1269 typedef typename Traits::Digraph Digraph;
1271 ///The visitor type used by the algorithm.
1272 typedef _Visitor Visitor;
1274 ///The type of the map that indicates which nodes are reached.
1275 typedef typename Traits::ReachedMap ReachedMap;
1279 typedef typename Digraph::Node Node;
1280 typedef typename Digraph::NodeIt NodeIt;
1281 typedef typename Digraph::Arc Arc;
1282 typedef typename Digraph::OutArcIt OutArcIt;
1284 //Pointer to the underlying digraph.
1285 const Digraph *_digraph;
1286 //Pointer to the visitor object.
1288 //Pointer to the map of reached status of the nodes.
1289 ReachedMap *_reached;
1290 //Indicates if _reached is locally allocated (true) or not.
1293 std::vector<typename Digraph::Arc> _stack;
1296 //Creates the maps if necessary.
1297 void create_maps() {
1299 local_reached = true;
1300 _reached = Traits::createReachedMap(*_digraph);
1310 typedef DfsVisit Create;
1312 /// \name Named template parameters
1316 struct SetReachedMapTraits : public Traits {
1317 typedef T ReachedMap;
1318 static ReachedMap *createReachedMap(const Digraph &digraph) {
1319 LEMON_ASSERT(false, "ReachedMap is not initialized");
1320 return 0; // ignore warnings
1323 /// \brief \ref named-templ-param "Named parameter" for setting
1324 /// ReachedMap type.
1326 /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1328 struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1329 SetReachedMapTraits<T> > {
1330 typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1336 /// \brief Constructor.
1340 /// \param digraph The digraph the algorithm runs on.
1341 /// \param visitor The visitor object of the algorithm.
1342 DfsVisit(const Digraph& digraph, Visitor& visitor)
1343 : _digraph(&digraph), _visitor(&visitor),
1344 _reached(0), local_reached(false) {}
1346 /// \brief Destructor.
1348 if(local_reached) delete _reached;
1351 /// \brief Sets the map that indicates which nodes are reached.
1353 /// Sets the map that indicates which nodes are reached.
1354 /// If you don't use this function before calling \ref run(),
1355 /// it will allocate one. The destructor deallocates this
1356 /// automatically allocated map, of course.
1357 /// \return <tt> (*this) </tt>
1358 DfsVisit &reachedMap(ReachedMap &m) {
1361 local_reached=false;
1369 /// \name Execution control
1370 /// The simplest way to execute the algorithm is to use
1371 /// one of the member functions called \ref lemon::DfsVisit::run()
1374 /// If you need more control on the execution, first you must call
1375 /// \ref lemon::DfsVisit::init() "init()", then you can add several
1376 /// source nodes with \ref lemon::DfsVisit::addSource() "addSource()".
1377 /// Finally \ref lemon::DfsVisit::start() "start()" will perform the
1378 /// actual path computation.
1382 /// \brief Initializes the internal data structures.
1384 /// Initializes the internal data structures.
1387 _stack.resize(countNodes(*_digraph));
1389 for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1390 _reached->set(u, false);
1394 ///Adds a new source node.
1396 ///Adds a new source node to the set of nodes to be processed.
1398 ///\pre The stack must be empty. (Otherwise the algorithm gives
1401 ///\warning Distances will be wrong (or at least strange) in case of
1402 ///multiple sources.
1403 void addSource(Node s)
1405 LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1406 if(!(*_reached)[s]) {
1407 _reached->set(s,true);
1411 _digraph->firstOut(e, s);
1413 _stack[++_stack_head] = e;
1420 /// \brief Processes the next arc.
1422 /// Processes the next arc.
1424 /// \return The processed arc.
1426 /// \pre The stack must not be empty.
1427 Arc processNextArc() {
1428 Arc e = _stack[_stack_head];
1429 Node m = _digraph->target(e);
1430 if(!(*_reached)[m]) {
1431 _visitor->discover(e);
1433 _reached->set(m, true);
1434 _digraph->firstOut(_stack[++_stack_head], m);
1436 _visitor->examine(e);
1437 m = _digraph->source(e);
1438 _digraph->nextOut(_stack[_stack_head]);
1440 while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1443 if (_stack_head >= 0) {
1444 _visitor->backtrack(_stack[_stack_head]);
1445 m = _digraph->source(_stack[_stack_head]);
1446 _digraph->nextOut(_stack[_stack_head]);
1454 /// \brief Next arc to be processed.
1456 /// Next arc to be processed.
1458 /// \return The next arc to be processed or INVALID if the stack is
1460 Arc nextArc() const {
1461 return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1464 /// \brief Returns \c false if there are nodes
1465 /// to be processed.
1467 /// Returns \c false if there are nodes
1468 /// to be processed in the queue (stack).
1469 bool emptyQueue() const { return _stack_head < 0; }
1471 /// \brief Returns the number of the nodes to be processed.
1473 /// Returns the number of the nodes to be processed in the queue (stack).
1474 int queueSize() const { return _stack_head + 1; }
1476 /// \brief Executes the algorithm.
1478 /// Executes the algorithm.
1480 /// This method runs the %DFS algorithm from the root node
1481 /// in order to compute the %DFS path to each node.
1483 /// The algorithm computes
1484 /// - the %DFS tree,
1485 /// - the distance of each node from the root in the %DFS tree.
1487 /// \pre init() must be called and a root node should be
1488 /// added with addSource() before using this function.
1490 /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1492 /// while ( !d.emptyQueue() ) {
1493 /// d.processNextArc();
1497 while ( !emptyQueue() ) processNextArc();
1500 /// \brief Executes the algorithm until the given target node is reached.
1502 /// Executes the algorithm until the given target node is reached.
1504 /// This method runs the %DFS algorithm from the root node
1505 /// in order to compute the DFS path to \c t.
1507 /// The algorithm computes
1508 /// - the %DFS path to \c t,
1509 /// - the distance of \c t from the root in the %DFS tree.
1511 /// \pre init() must be called and a root node should be added
1512 /// with addSource() before using this function.
1513 void start(Node t) {
1514 while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
1518 /// \brief Executes the algorithm until a condition is met.
1520 /// Executes the algorithm until a condition is met.
1522 /// This method runs the %DFS algorithm from the root node
1523 /// until an arc \c a with <tt>am[a]</tt> true is found.
1525 /// \param am A \c bool (or convertible) arc map. The algorithm
1526 /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1528 /// \return The reached arc \c a with <tt>am[a]</tt> true or
1529 /// \c INVALID if no such arc was found.
1531 /// \pre init() must be called and a root node should be added
1532 /// with addSource() before using this function.
1534 /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1536 template <typename AM>
1537 Arc start(const AM &am) {
1538 while ( !emptyQueue() && !am[_stack[_stack_head]] )
1540 return emptyQueue() ? INVALID : _stack[_stack_head];
1543 /// \brief Runs the algorithm from the given source node.
1545 /// This method runs the %DFS algorithm from node \c s.
1546 /// in order to compute the DFS path to each node.
1548 /// The algorithm computes
1549 /// - the %DFS tree,
1550 /// - the distance of each node from the root in the %DFS tree.
1552 /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1564 /// \brief Finds the %DFS path between \c s and \c t.
1566 /// This method runs the %DFS algorithm from node \c s
1567 /// in order to compute the DFS path to node \c t
1568 /// (it stops searching when \c t is processed).
1570 /// \return \c true if \c t is reachable form \c s.
1572 /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1573 /// just a shortcut of the following code.
1579 bool run(Node s,Node t) {
1586 /// \brief Runs the algorithm to visit all nodes in the digraph.
1588 /// This method runs the %DFS algorithm in order to
1589 /// compute the %DFS path to each node.
1591 /// The algorithm computes
1592 /// - the %DFS tree,
1593 /// - the distance of each node from the root in the %DFS tree.
1595 /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1598 /// for (NodeIt n(digraph); n != INVALID; ++n) {
1599 /// if (!d.reached(n)) {
1607 for (NodeIt it(*_digraph); it != INVALID; ++it) {
1617 /// \name Query Functions
1618 /// The result of the %DFS algorithm can be obtained using these
1620 /// Either \ref lemon::DfsVisit::run() "run()" or
1621 /// \ref lemon::DfsVisit::start() "start()" must be called before
1625 /// \brief Checks if a node is reachable from the root(s).
1627 /// Returns \c true if \c v is reachable from the root(s).
1628 /// \pre Either \ref run() or \ref start()
1629 /// must be called before using this function.
1630 bool reached(Node v) { return (*_reached)[v]; }
1636 } //END OF NAMESPACE LEMON