1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2009
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 conform to the \ref concepts::WriteMap "WriteMap" concept.
51 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 ///Instantiates a \c PredMap.
54 ///This function instantiates a \ref 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 conform to the \ref concepts::WriteMap "WriteMap" concept.
66 ///By default, it is a NullMap.
67 typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 ///Instantiates a \c ProcessedMap.
70 ///This function instantiates a \ref ProcessedMap.
71 ///\param g is the digraph, to which
72 ///we would like to define the \ref ProcessedMap.
74 static ProcessedMap *createProcessedMap(const Digraph &g)
76 static ProcessedMap *createProcessedMap(const Digraph &)
79 return new ProcessedMap();
82 ///The type of the map that indicates which nodes are reached.
84 ///The type of the map that indicates which nodes are reached.
85 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 ///Instantiates a \c ReachedMap.
89 ///This function instantiates a \ref ReachedMap.
90 ///\param g is the digraph, to which
91 ///we would like to define the \ref ReachedMap.
92 static ReachedMap *createReachedMap(const Digraph &g)
94 return new ReachedMap(g);
97 ///The type of the map that stores the distances of the nodes.
99 ///The type of the map that stores the distances of the nodes.
100 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
101 typedef typename Digraph::template NodeMap<int> DistMap;
102 ///Instantiates a \c DistMap.
104 ///This function instantiates a \ref DistMap.
105 ///\param g is the digraph, to which we would like to define the
107 static DistMap *createDistMap(const Digraph &g)
109 return new DistMap(g);
113 ///%DFS algorithm class.
116 ///This class provides an efficient implementation of the %DFS algorithm.
118 ///There is also a \ref dfs() "function-type interface" for the DFS
119 ///algorithm, which is convenient in the simplier cases and it can be
122 ///\tparam GR The type of the digraph the algorithm runs on.
123 ///The default type is \ref ListDigraph.
125 template <typename GR,
128 template <typename GR=ListDigraph,
129 typename TR=DfsDefaultTraits<GR> >
134 ///The type of the digraph the algorithm runs on.
135 typedef typename TR::Digraph Digraph;
137 ///\brief The type of the map that stores the predecessor arcs of the
139 typedef typename TR::PredMap PredMap;
140 ///The type of the map that stores the distances of the nodes.
141 typedef typename TR::DistMap DistMap;
142 ///The type of the map that indicates which nodes are reached.
143 typedef typename TR::ReachedMap ReachedMap;
144 ///The type of the map that indicates which nodes are processed.
145 typedef typename TR::ProcessedMap ProcessedMap;
146 ///The type of the paths.
147 typedef PredMapPath<Digraph, PredMap> Path;
149 ///The \ref DfsDefaultTraits "traits class" of the algorithm.
154 typedef typename Digraph::Node Node;
155 typedef typename Digraph::NodeIt NodeIt;
156 typedef typename Digraph::Arc Arc;
157 typedef typename Digraph::OutArcIt OutArcIt;
159 //Pointer to the underlying digraph.
161 //Pointer to the map of predecessor arcs.
163 //Indicates if _pred is locally allocated (true) or not.
165 //Pointer to the map of distances.
167 //Indicates if _dist is locally allocated (true) or not.
169 //Pointer to the map of reached status of the nodes.
170 ReachedMap *_reached;
171 //Indicates if _reached is locally allocated (true) or not.
173 //Pointer to the map of processed status of the nodes.
174 ProcessedMap *_processed;
175 //Indicates if _processed is locally allocated (true) or not.
176 bool local_processed;
178 std::vector<typename Digraph::OutArcIt> _stack;
181 //Creates the maps if necessary.
186 _pred = Traits::createPredMap(*G);
190 _dist = Traits::createDistMap(*G);
193 local_reached = true;
194 _reached = Traits::createReachedMap(*G);
197 local_processed = true;
198 _processed = Traits::createProcessedMap(*G);
210 ///\name Named Template Parameters
215 struct SetPredMapTraits : public Traits {
217 static PredMap *createPredMap(const Digraph &)
219 LEMON_ASSERT(false, "PredMap is not initialized");
220 return 0; // ignore warnings
223 ///\brief \ref named-templ-param "Named parameter" for setting
226 ///\ref named-templ-param "Named parameter" for setting
228 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
230 struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
231 typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
235 struct SetDistMapTraits : public Traits {
237 static DistMap *createDistMap(const Digraph &)
239 LEMON_ASSERT(false, "DistMap is not initialized");
240 return 0; // ignore warnings
243 ///\brief \ref named-templ-param "Named parameter" for setting
246 ///\ref named-templ-param "Named parameter" for setting
248 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
250 struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
251 typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
255 struct SetReachedMapTraits : public Traits {
256 typedef T ReachedMap;
257 static ReachedMap *createReachedMap(const Digraph &)
259 LEMON_ASSERT(false, "ReachedMap is not initialized");
260 return 0; // ignore warnings
263 ///\brief \ref named-templ-param "Named parameter" for setting
264 ///\c ReachedMap type.
266 ///\ref named-templ-param "Named parameter" for setting
267 ///\c ReachedMap type.
268 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
270 struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
271 typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
275 struct SetProcessedMapTraits : public Traits {
276 typedef T ProcessedMap;
277 static ProcessedMap *createProcessedMap(const Digraph &)
279 LEMON_ASSERT(false, "ProcessedMap is not initialized");
280 return 0; // ignore warnings
283 ///\brief \ref named-templ-param "Named parameter" for setting
284 ///\c ProcessedMap type.
286 ///\ref named-templ-param "Named parameter" for setting
287 ///\c ProcessedMap type.
288 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
290 struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
291 typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
294 struct SetStandardProcessedMapTraits : public Traits {
295 typedef typename Digraph::template NodeMap<bool> ProcessedMap;
296 static ProcessedMap *createProcessedMap(const Digraph &g)
298 return new ProcessedMap(g);
301 ///\brief \ref named-templ-param "Named parameter" for setting
302 ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
304 ///\ref named-templ-param "Named parameter" for setting
305 ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
306 ///If you don't set it explicitly, it will be automatically allocated.
307 struct SetStandardProcessedMap :
308 public Dfs< Digraph, SetStandardProcessedMapTraits > {
309 typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
319 ///\param g The digraph the algorithm runs on.
320 Dfs(const Digraph &g) :
322 _pred(NULL), local_pred(false),
323 _dist(NULL), local_dist(false),
324 _reached(NULL), local_reached(false),
325 _processed(NULL), local_processed(false)
331 if(local_pred) delete _pred;
332 if(local_dist) delete _dist;
333 if(local_reached) delete _reached;
334 if(local_processed) delete _processed;
337 ///Sets the map that stores the predecessor arcs.
339 ///Sets the map that stores the predecessor arcs.
340 ///If you don't use this function before calling \ref run(Node) "run()"
341 ///or \ref init(), an instance will be allocated automatically.
342 ///The destructor deallocates this automatically allocated map,
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(Node) "run()"
359 ///or \ref init(), an instance will be allocated automatically.
360 ///The destructor deallocates this automatically allocated map,
362 ///\return <tt> (*this) </tt>
363 Dfs &reachedMap(ReachedMap &m)
373 ///Sets the map that indicates which nodes are processed.
375 ///Sets the map that indicates which nodes are processed.
376 ///If you don't use this function before calling \ref run(Node) "run()"
377 ///or \ref init(), an instance will be allocated automatically.
378 ///The destructor deallocates this automatically allocated map,
380 ///\return <tt> (*this) </tt>
381 Dfs &processedMap(ProcessedMap &m)
383 if(local_processed) {
385 local_processed=false;
391 ///Sets the map that stores the distances of the nodes.
393 ///Sets the map that stores the distances of the nodes calculated by
395 ///If you don't use this function before calling \ref run(Node) "run()"
396 ///or \ref init(), an instance will be allocated automatically.
397 ///The destructor deallocates this automatically allocated map,
399 ///\return <tt> (*this) </tt>
400 Dfs &distMap(DistMap &m)
412 ///\name Execution Control
413 ///The simplest way to execute the DFS algorithm is to use one of the
414 ///member functions called \ref run(Node) "run()".\n
415 ///If you need better control on the execution, you have to call
416 ///\ref init() first, then you can add a source node with \ref addSource()
417 ///and perform the actual computation with \ref start().
418 ///This procedure can be repeated if there are nodes that have not
423 ///\brief Initializes the internal data structures.
425 ///Initializes the internal data structures.
429 _stack.resize(countNodes(*G));
431 for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
432 _pred->set(u,INVALID);
433 _reached->set(u,false);
434 _processed->set(u,false);
438 ///Adds a new source node.
440 ///Adds a new source node to the set of nodes to be processed.
442 ///\pre The stack must be empty. Otherwise the algorithm gives
443 ///wrong results. (One of the outgoing arcs of all the source nodes
444 ///except for the last one will not be visited and distances will
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 ///Returns \c false if there are nodes to be processed.
511 ///Returns \c false if there are nodes to be processed
512 ///in the queue (stack).
513 bool emptyQueue() const { return _stack_head<0; }
515 ///Returns the number of the nodes to be processed.
517 ///Returns the number of the nodes to be processed
518 ///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 visit all nodes
639 ///\note <tt>d.run()</tt> is just a shortcut of the following code.
642 /// for (NodeIt n(digraph); n != INVALID; ++n) {
643 /// if (!d.reached(n)) {
651 for (NodeIt it(*G); it != INVALID; ++it) {
661 ///\name Query Functions
662 ///The results of the DFS algorithm can be obtained using these
664 ///Either \ref run(Node) "run()" or \ref start() should be called
665 ///before using them.
669 ///The DFS path to the given node.
671 ///Returns the DFS path to the given node from the root(s).
673 ///\warning \c t should be reached from the root(s).
675 ///\pre Either \ref run(Node) "run()" or \ref init()
676 ///must be called before using this function.
677 Path path(Node t) const { return Path(*G, *_pred, t); }
679 ///The distance of the given node from the root(s).
681 ///Returns the distance of the given node from the root(s).
683 ///\warning If node \c v is not reached from the root(s), then
684 ///the return value of this function is undefined.
686 ///\pre Either \ref run(Node) "run()" or \ref init()
687 ///must be called before using this function.
688 int dist(Node v) const { return (*_dist)[v]; }
690 ///Returns the 'previous arc' of the %DFS tree for the given node.
692 ///This function returns the 'previous arc' of the %DFS tree for the
693 ///node \c v, i.e. it returns the last arc of a %DFS path from a
694 ///root to \c v. It is \c INVALID if \c v is not reached from the
695 ///root(s) or if \c v is a root.
697 ///The %DFS tree used here is equal to the %DFS tree used in
698 ///\ref predNode() and \ref predMap().
700 ///\pre Either \ref run(Node) "run()" or \ref init()
701 ///must be called before using this function.
702 Arc predArc(Node v) const { return (*_pred)[v];}
704 ///Returns the 'previous node' of the %DFS tree for the given node.
706 ///This function returns the 'previous node' of the %DFS
707 ///tree for the node \c v, i.e. it returns the last but one node
708 ///of a %DFS path from a root to \c v. It is \c INVALID
709 ///if \c v is not reached from the root(s) or if \c v is a root.
711 ///The %DFS tree used here is equal to the %DFS tree used in
712 ///\ref predArc() and \ref predMap().
714 ///\pre Either \ref run(Node) "run()" or \ref init()
715 ///must be called before using this function.
716 Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
717 G->source((*_pred)[v]); }
719 ///\brief Returns a const reference to the node map that stores the
720 ///distances of the nodes.
722 ///Returns a const reference to the node map that stores the
723 ///distances of the nodes calculated by the algorithm.
725 ///\pre Either \ref run(Node) "run()" or \ref init()
726 ///must be called before using this function.
727 const DistMap &distMap() const { return *_dist;}
729 ///\brief Returns a const reference to the node map that stores the
732 ///Returns a const reference to the node map that stores the predecessor
733 ///arcs, which form the DFS tree (forest).
735 ///\pre Either \ref run(Node) "run()" or \ref init()
736 ///must be called before using this function.
737 const PredMap &predMap() const { return *_pred;}
739 ///Checks if the given node. node is reached from the root(s).
741 ///Returns \c true if \c v is reached from the root(s).
743 ///\pre Either \ref run(Node) "run()" or \ref init()
744 ///must be called before using this function.
745 bool reached(Node v) const { return (*_reached)[v]; }
750 ///Default traits class of dfs() function.
752 ///Default traits class of dfs() function.
753 ///\tparam GR Digraph type.
755 struct DfsWizardDefaultTraits
757 ///The type of the digraph the algorithm runs on.
760 ///\brief The type of the map that stores the predecessor
761 ///arcs of the %DFS paths.
763 ///The type of the map that stores the predecessor
764 ///arcs of the %DFS paths.
765 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
766 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
767 ///Instantiates a PredMap.
769 ///This function instantiates a PredMap.
770 ///\param g is the digraph, to which we would like to define the
772 static PredMap *createPredMap(const Digraph &g)
774 return new PredMap(g);
777 ///The type of the map that indicates which nodes are processed.
779 ///The type of the map that indicates which nodes are processed.
780 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
781 ///By default, it is a NullMap.
782 typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
783 ///Instantiates a ProcessedMap.
785 ///This function instantiates a ProcessedMap.
786 ///\param g is the digraph, to which
787 ///we would like to define the ProcessedMap.
789 static ProcessedMap *createProcessedMap(const Digraph &g)
791 static ProcessedMap *createProcessedMap(const Digraph &)
794 return new ProcessedMap();
797 ///The type of the map that indicates which nodes are reached.
799 ///The type of the map that indicates which nodes are reached.
800 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
801 typedef typename Digraph::template NodeMap<bool> ReachedMap;
802 ///Instantiates a ReachedMap.
804 ///This function instantiates a ReachedMap.
805 ///\param g is the digraph, to which
806 ///we would like to define the ReachedMap.
807 static ReachedMap *createReachedMap(const Digraph &g)
809 return new ReachedMap(g);
812 ///The type of the map that stores the distances of the nodes.
814 ///The type of the map that stores the distances of the nodes.
815 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
816 typedef typename Digraph::template NodeMap<int> DistMap;
817 ///Instantiates a DistMap.
819 ///This function instantiates a DistMap.
820 ///\param g is the digraph, to which we would like to define
822 static DistMap *createDistMap(const Digraph &g)
824 return new DistMap(g);
827 ///The type of the DFS paths.
829 ///The type of the DFS paths.
830 ///It must conform to the \ref concepts::Path "Path" concept.
831 typedef lemon::Path<Digraph> Path;
834 /// Default traits class used by DfsWizard
836 /// Default traits class used by DfsWizard.
837 /// \tparam GR The type of the digraph.
839 class DfsWizardBase : public DfsWizardDefaultTraits<GR>
842 typedef DfsWizardDefaultTraits<GR> Base;
844 //The type of the nodes in the digraph.
845 typedef typename Base::Digraph::Node Node;
847 //Pointer to the digraph the algorithm runs on.
849 //Pointer to the map of reached nodes.
851 //Pointer to the map of processed nodes.
853 //Pointer to the map of predecessors arcs.
855 //Pointer to the map of distances.
857 //Pointer to the DFS path to the target node.
859 //Pointer to the distance of the target node.
865 /// This constructor does not require parameters, it initiates
866 /// all of the attributes to \c 0.
867 DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
868 _dist(0), _path(0), _di(0) {}
872 /// This constructor requires one parameter,
873 /// others are initiated to \c 0.
874 /// \param g The digraph the algorithm runs on.
875 DfsWizardBase(const GR &g) :
876 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
877 _reached(0), _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
881 /// Auxiliary class for the function-type interface of DFS algorithm.
883 /// This auxiliary class is created to implement the
884 /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
885 /// It does not have own \ref run(Node) "run()" method, it uses the
886 /// functions and features of the plain \ref Dfs.
888 /// This class should only be used through the \ref dfs() function,
889 /// which makes it easier to use the algorithm.
891 class DfsWizard : public TR
895 typedef typename TR::Digraph Digraph;
897 typedef typename Digraph::Node Node;
898 typedef typename Digraph::NodeIt NodeIt;
899 typedef typename Digraph::Arc Arc;
900 typedef typename Digraph::OutArcIt OutArcIt;
902 typedef typename TR::PredMap PredMap;
903 typedef typename TR::DistMap DistMap;
904 typedef typename TR::ReachedMap ReachedMap;
905 typedef typename TR::ProcessedMap ProcessedMap;
906 typedef typename TR::Path Path;
911 DfsWizard() : TR() {}
913 /// Constructor that requires parameters.
915 /// Constructor that requires parameters.
916 /// These parameters will be the default values for the traits class.
917 /// \param g The digraph the algorithm runs on.
918 DfsWizard(const Digraph &g) :
922 DfsWizard(const TR &b) : TR(b) {}
926 ///Runs DFS algorithm from the given source node.
928 ///This method runs DFS algorithm from node \c s
929 ///in order to compute the DFS path to each node.
932 Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
934 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
936 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
938 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
939 if (Base::_processed)
940 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
947 ///Finds the DFS path between \c s and \c t.
949 ///This method runs DFS algorithm from node \c s
950 ///in order to compute the DFS path to node \c t
951 ///(it stops searching when \c t is processed).
953 ///\return \c true if \c t is reachable form \c s.
954 bool run(Node s, Node t)
956 Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
958 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
960 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
962 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
963 if (Base::_processed)
964 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
967 *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
969 *Base::_di = alg.dist(t);
970 return alg.reached(t);
973 ///Runs DFS algorithm to visit all nodes in the digraph.
975 ///This method runs DFS algorithm in order to visit all nodes
983 struct SetPredMapBase : public Base {
985 static PredMap *createPredMap(const Digraph &) { return 0; };
986 SetPredMapBase(const TR &b) : TR(b) {}
989 ///\brief \ref named-templ-param "Named parameter" for setting
990 ///the predecessor map.
992 ///\ref named-templ-param "Named parameter" function for setting
993 ///the map that stores the predecessor arcs of the nodes.
995 DfsWizard<SetPredMapBase<T> > predMap(const T &t)
997 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
998 return DfsWizard<SetPredMapBase<T> >(*this);
1002 struct SetReachedMapBase : public Base {
1003 typedef T ReachedMap;
1004 static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1005 SetReachedMapBase(const TR &b) : TR(b) {}
1008 ///\brief \ref named-templ-param "Named parameter" for setting
1011 ///\ref named-templ-param "Named parameter" function for setting
1012 ///the map that indicates which nodes are reached.
1014 DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1016 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1017 return DfsWizard<SetReachedMapBase<T> >(*this);
1021 struct SetDistMapBase : public Base {
1023 static DistMap *createDistMap(const Digraph &) { return 0; };
1024 SetDistMapBase(const TR &b) : TR(b) {}
1027 ///\brief \ref named-templ-param "Named parameter" for setting
1028 ///the distance map.
1030 ///\ref named-templ-param "Named parameter" function for setting
1031 ///the map that stores the distances of the nodes calculated
1032 ///by the algorithm.
1034 DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1036 Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1037 return DfsWizard<SetDistMapBase<T> >(*this);
1041 struct SetProcessedMapBase : public Base {
1042 typedef T ProcessedMap;
1043 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1044 SetProcessedMapBase(const TR &b) : TR(b) {}
1047 ///\brief \ref named-func-param "Named parameter" for setting
1048 ///the processed map.
1050 ///\ref named-templ-param "Named parameter" function for setting
1051 ///the map that indicates which nodes are processed.
1053 DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1055 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1056 return DfsWizard<SetProcessedMapBase<T> >(*this);
1060 struct SetPathBase : public Base {
1062 SetPathBase(const TR &b) : TR(b) {}
1064 ///\brief \ref named-func-param "Named parameter"
1065 ///for getting the DFS path to the target node.
1067 ///\ref named-func-param "Named parameter"
1068 ///for getting the DFS path to the target node.
1070 DfsWizard<SetPathBase<T> > path(const T &t)
1072 Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1073 return DfsWizard<SetPathBase<T> >(*this);
1076 ///\brief \ref named-func-param "Named parameter"
1077 ///for getting the distance of the target node.
1079 ///\ref named-func-param "Named parameter"
1080 ///for getting the distance of the target node.
1081 DfsWizard dist(const int &d)
1083 Base::_di=const_cast<int*>(&d);
1089 ///Function-type interface for DFS algorithm.
1092 ///Function-type interface for DFS algorithm.
1094 ///This function also has several \ref named-func-param "named parameters",
1095 ///they are declared as the members of class \ref DfsWizard.
1096 ///The following examples show how to use these parameters.
1098 /// // Compute the DFS tree
1099 /// dfs(g).predMap(preds).distMap(dists).run(s);
1101 /// // Compute the DFS path from s to t
1102 /// bool reached = dfs(g).path(p).dist(d).run(s,t);
1104 ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
1105 ///to the end of the parameter list.
1109 DfsWizard<DfsWizardBase<GR> >
1110 dfs(const GR &digraph)
1112 return DfsWizard<DfsWizardBase<GR> >(digraph);
1116 /// \brief Visitor class for DFS.
1118 /// This class defines the interface of the DfsVisit events, and
1119 /// it could be the base of a real visitor class.
1120 template <typename GR>
1123 typedef typename Digraph::Arc Arc;
1124 typedef typename Digraph::Node Node;
1125 /// \brief Called for the source node of the DFS.
1127 /// This function is called for the source node of the DFS.
1128 void start(const Node& node) {}
1129 /// \brief Called when the source node is leaved.
1131 /// This function is called when the source node is leaved.
1132 void stop(const Node& node) {}
1133 /// \brief Called when a node is reached first time.
1135 /// This function is called when a node is reached first time.
1136 void reach(const Node& node) {}
1137 /// \brief Called when an arc reaches a new node.
1139 /// This function is called when the DFS finds an arc whose target node
1140 /// is not reached yet.
1141 void discover(const Arc& arc) {}
1142 /// \brief Called when an arc is examined but its target node is
1143 /// already discovered.
1145 /// This function is called when an arc is examined but its target node is
1146 /// already discovered.
1147 void examine(const Arc& arc) {}
1148 /// \brief Called when the DFS steps back from a node.
1150 /// This function is called when the DFS steps back from a node.
1151 void leave(const Node& node) {}
1152 /// \brief Called when the DFS steps back on an arc.
1154 /// This function is called when the DFS steps back on an arc.
1155 void backtrack(const Arc& arc) {}
1158 template <typename GR>
1161 typedef typename Digraph::Arc Arc;
1162 typedef typename Digraph::Node Node;
1163 void start(const Node&) {}
1164 void stop(const Node&) {}
1165 void reach(const Node&) {}
1166 void discover(const Arc&) {}
1167 void examine(const Arc&) {}
1168 void leave(const Node&) {}
1169 void backtrack(const Arc&) {}
1171 template <typename _Visitor>
1172 struct Constraints {
1173 void constraints() {
1176 visitor.start(node);
1178 visitor.reach(node);
1179 visitor.discover(arc);
1180 visitor.examine(arc);
1181 visitor.leave(node);
1182 visitor.backtrack(arc);
1189 /// \brief Default traits class of DfsVisit class.
1191 /// Default traits class of DfsVisit class.
1192 /// \tparam _Digraph The type of the digraph the algorithm runs on.
1194 struct DfsVisitDefaultTraits {
1196 /// \brief The type of the digraph the algorithm runs on.
1199 /// \brief The type of the map that indicates which nodes are reached.
1201 /// The type of the map that indicates which nodes are reached.
1202 /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1203 typedef typename Digraph::template NodeMap<bool> ReachedMap;
1205 /// \brief Instantiates a ReachedMap.
1207 /// This function instantiates a ReachedMap.
1208 /// \param digraph is the digraph, to which
1209 /// we would like to define the ReachedMap.
1210 static ReachedMap *createReachedMap(const Digraph &digraph) {
1211 return new ReachedMap(digraph);
1218 /// \brief DFS algorithm class with visitor interface.
1220 /// This class provides an efficient implementation of the DFS algorithm
1221 /// with visitor interface.
1223 /// The DfsVisit class provides an alternative interface to the Dfs
1224 /// class. It works with callback mechanism, the DfsVisit object calls
1225 /// the member functions of the \c Visitor class on every DFS event.
1227 /// This interface of the DFS algorithm should be used in special cases
1228 /// when extra actions have to be performed in connection with certain
1229 /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1232 /// \tparam GR The type of the digraph the algorithm runs on.
1233 /// The default type is \ref ListDigraph.
1234 /// The value of GR is not used directly by \ref DfsVisit,
1235 /// it is only passed to \ref DfsVisitDefaultTraits.
1236 /// \tparam VS The Visitor type that is used by the algorithm.
1237 /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
1238 /// does not observe the DFS events. If you want to observe the DFS
1239 /// events, you should implement your own visitor class.
1240 /// \tparam TR Traits class to set various data types used by the
1241 /// algorithm. The default traits class is
1242 /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
1243 /// See \ref DfsVisitDefaultTraits for the documentation of
1244 /// a DFS visit traits class.
1246 template <typename GR, typename VS, typename TR>
1248 template <typename GR = ListDigraph,
1249 typename VS = DfsVisitor<GR>,
1250 typename TR = DfsVisitDefaultTraits<GR> >
1255 ///The traits class.
1258 ///The type of the digraph the algorithm runs on.
1259 typedef typename Traits::Digraph Digraph;
1261 ///The visitor type used by the algorithm.
1264 ///The type of the map that indicates which nodes are reached.
1265 typedef typename Traits::ReachedMap ReachedMap;
1269 typedef typename Digraph::Node Node;
1270 typedef typename Digraph::NodeIt NodeIt;
1271 typedef typename Digraph::Arc Arc;
1272 typedef typename Digraph::OutArcIt OutArcIt;
1274 //Pointer to the underlying digraph.
1275 const Digraph *_digraph;
1276 //Pointer to the visitor object.
1278 //Pointer to the map of reached status of the nodes.
1279 ReachedMap *_reached;
1280 //Indicates if _reached is locally allocated (true) or not.
1283 std::vector<typename Digraph::Arc> _stack;
1286 //Creates the maps if necessary.
1287 void create_maps() {
1289 local_reached = true;
1290 _reached = Traits::createReachedMap(*_digraph);
1300 typedef DfsVisit Create;
1302 /// \name Named Template Parameters
1306 struct SetReachedMapTraits : public Traits {
1307 typedef T ReachedMap;
1308 static ReachedMap *createReachedMap(const Digraph &digraph) {
1309 LEMON_ASSERT(false, "ReachedMap is not initialized");
1310 return 0; // ignore warnings
1313 /// \brief \ref named-templ-param "Named parameter" for setting
1314 /// ReachedMap type.
1316 /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1318 struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1319 SetReachedMapTraits<T> > {
1320 typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1326 /// \brief Constructor.
1330 /// \param digraph The digraph the algorithm runs on.
1331 /// \param visitor The visitor object of the algorithm.
1332 DfsVisit(const Digraph& digraph, Visitor& visitor)
1333 : _digraph(&digraph), _visitor(&visitor),
1334 _reached(0), local_reached(false) {}
1336 /// \brief Destructor.
1338 if(local_reached) delete _reached;
1341 /// \brief Sets the map that indicates which nodes are reached.
1343 /// Sets the map that indicates which nodes are reached.
1344 /// If you don't use this function before calling \ref run(Node) "run()"
1345 /// or \ref init(), an instance will be allocated automatically.
1346 /// The destructor deallocates this automatically allocated map,
1348 /// \return <tt> (*this) </tt>
1349 DfsVisit &reachedMap(ReachedMap &m) {
1352 local_reached=false;
1360 /// \name Execution Control
1361 /// The simplest way to execute the DFS algorithm is to use one of the
1362 /// member functions called \ref run(Node) "run()".\n
1363 /// If you need better control on the execution, you have to call
1364 /// \ref init() first, then you can add a source node with \ref addSource()
1365 /// and perform the actual computation with \ref start().
1366 /// This procedure can be repeated if there are nodes that have not
1371 /// \brief Initializes the internal data structures.
1373 /// Initializes the internal data structures.
1376 _stack.resize(countNodes(*_digraph));
1378 for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1379 _reached->set(u, false);
1383 /// \brief Adds a new source node.
1385 /// Adds a new source node to the set of nodes to be processed.
1387 /// \pre The stack must be empty. Otherwise the algorithm gives
1388 /// wrong results. (One of the outgoing arcs of all the source nodes
1389 /// except for the last one will not be visited and distances will
1391 void addSource(Node s)
1393 LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1394 if(!(*_reached)[s]) {
1395 _reached->set(s,true);
1399 _digraph->firstOut(e, s);
1401 _stack[++_stack_head] = e;
1409 /// \brief Processes the next arc.
1411 /// Processes the next arc.
1413 /// \return The processed arc.
1415 /// \pre The stack must not be empty.
1416 Arc processNextArc() {
1417 Arc e = _stack[_stack_head];
1418 Node m = _digraph->target(e);
1419 if(!(*_reached)[m]) {
1420 _visitor->discover(e);
1422 _reached->set(m, true);
1423 _digraph->firstOut(_stack[++_stack_head], m);
1425 _visitor->examine(e);
1426 m = _digraph->source(e);
1427 _digraph->nextOut(_stack[_stack_head]);
1429 while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1432 if (_stack_head >= 0) {
1433 _visitor->backtrack(_stack[_stack_head]);
1434 m = _digraph->source(_stack[_stack_head]);
1435 _digraph->nextOut(_stack[_stack_head]);
1443 /// \brief Next arc to be processed.
1445 /// Next arc to be processed.
1447 /// \return The next arc to be processed or INVALID if the stack is
1449 Arc nextArc() const {
1450 return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1453 /// \brief Returns \c false if there are nodes
1454 /// to be processed.
1456 /// Returns \c false if there are nodes
1457 /// to be processed in the queue (stack).
1458 bool emptyQueue() const { return _stack_head < 0; }
1460 /// \brief Returns the number of the nodes to be processed.
1462 /// Returns the number of the nodes to be processed in the queue (stack).
1463 int queueSize() const { return _stack_head + 1; }
1465 /// \brief Executes the algorithm.
1467 /// Executes the algorithm.
1469 /// This method runs the %DFS algorithm from the root node
1470 /// in order to compute the %DFS path to each node.
1472 /// The algorithm computes
1473 /// - the %DFS tree,
1474 /// - the distance of each node from the root in the %DFS tree.
1476 /// \pre init() must be called and a root node should be
1477 /// added with addSource() before using this function.
1479 /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1481 /// while ( !d.emptyQueue() ) {
1482 /// d.processNextArc();
1486 while ( !emptyQueue() ) processNextArc();
1489 /// \brief Executes the algorithm until the given target node is reached.
1491 /// Executes the algorithm until the given target node is reached.
1493 /// This method runs the %DFS algorithm from the root node
1494 /// in order to compute the DFS path to \c t.
1496 /// The algorithm computes
1497 /// - the %DFS path to \c t,
1498 /// - the distance of \c t from the root in the %DFS tree.
1500 /// \pre init() must be called and a root node should be added
1501 /// with addSource() before using this function.
1502 void start(Node t) {
1503 while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
1507 /// \brief Executes the algorithm until a condition is met.
1509 /// Executes the algorithm until a condition is met.
1511 /// This method runs the %DFS algorithm from the root node
1512 /// until an arc \c a with <tt>am[a]</tt> true is found.
1514 /// \param am A \c bool (or convertible) arc map. The algorithm
1515 /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1517 /// \return The reached arc \c a with <tt>am[a]</tt> true or
1518 /// \c INVALID if no such arc was found.
1520 /// \pre init() must be called and a root node should be added
1521 /// with addSource() before using this function.
1523 /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1525 template <typename AM>
1526 Arc start(const AM &am) {
1527 while ( !emptyQueue() && !am[_stack[_stack_head]] )
1529 return emptyQueue() ? INVALID : _stack[_stack_head];
1532 /// \brief Runs the algorithm from the given source node.
1534 /// This method runs the %DFS algorithm from node \c s.
1535 /// in order to compute the DFS path to each node.
1537 /// The algorithm computes
1538 /// - the %DFS tree,
1539 /// - the distance of each node from the root in the %DFS tree.
1541 /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1553 /// \brief Finds the %DFS path between \c s and \c t.
1555 /// This method runs the %DFS algorithm from node \c s
1556 /// in order to compute the DFS path to node \c t
1557 /// (it stops searching when \c t is processed).
1559 /// \return \c true if \c t is reachable form \c s.
1561 /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1562 /// just a shortcut of the following code.
1568 bool run(Node s,Node t) {
1575 /// \brief Runs the algorithm to visit all nodes in the digraph.
1577 /// This method runs the %DFS algorithm in order to visit all nodes
1580 /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1583 /// for (NodeIt n(digraph); n != INVALID; ++n) {
1584 /// if (!d.reached(n)) {
1592 for (NodeIt it(*_digraph); it != INVALID; ++it) {
1602 /// \name Query Functions
1603 /// The results of the DFS algorithm can be obtained using these
1605 /// Either \ref run(Node) "run()" or \ref start() should be called
1606 /// before using them.
1610 /// \brief Checks if the given node is reached from the root(s).
1612 /// Returns \c true if \c v is reached from the root(s).
1614 /// \pre Either \ref run(Node) "run()" or \ref init()
1615 /// must be called before using this function.
1616 bool reached(Node v) const { return (*_reached)[v]; }
1622 } //END OF NAMESPACE LEMON