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 BFS 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 Bfs class.
37 ///Default traits class of Bfs class.
38 ///\tparam GR Digraph type.
40 struct BfsDefaultTraits
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 shortest paths.
48 ///The type of the map that stores the predecessor
49 ///arcs of the shortest 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.///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
84 typedef typename Digraph::template NodeMap<bool> ReachedMap;
85 ///Instantiates a ReachedMap.
87 ///This function instantiates a ReachedMap.
88 ///\param g is the digraph, to which
89 ///we would like to define the ReachedMap.
90 static ReachedMap *createReachedMap(const Digraph &g)
92 return new ReachedMap(g);
95 ///The type of the map that stores the distances of the nodes.
97 ///The type of the map that stores the distances of the nodes.
98 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
99 typedef typename Digraph::template NodeMap<int> DistMap;
100 ///Instantiates a DistMap.
102 ///This function instantiates a DistMap.
103 ///\param g is the digraph, to which we would like to define the
105 static DistMap *createDistMap(const Digraph &g)
107 return new DistMap(g);
111 ///%BFS algorithm class.
114 ///This class provides an efficient implementation of the %BFS algorithm.
116 ///There is also a \ref bfs() "function-type interface" for the BFS
117 ///algorithm, which is convenient in the simplier cases and it can be
120 ///\tparam GR The type of the digraph the algorithm runs on.
121 ///The default value is \ref ListDigraph. The value of GR is not used
122 ///directly by \ref Bfs, it is only passed to \ref BfsDefaultTraits.
123 ///\tparam TR Traits class to set various data types used by the algorithm.
124 ///The default traits class is
125 ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
126 ///See \ref BfsDefaultTraits for the documentation of
127 ///a Bfs traits class.
129 template <typename GR,
132 template <typename GR=ListDigraph,
133 typename TR=BfsDefaultTraits<GR> >
138 ///The type of the digraph the algorithm runs on.
139 typedef typename TR::Digraph Digraph;
141 ///\brief The type of the map that stores the predecessor arcs of the
143 typedef typename TR::PredMap PredMap;
144 ///The type of the map that stores the distances of the nodes.
145 typedef typename TR::DistMap DistMap;
146 ///The type of the map that indicates which nodes are reached.
147 typedef typename TR::ReachedMap ReachedMap;
148 ///The type of the map that indicates which nodes are processed.
149 typedef typename TR::ProcessedMap ProcessedMap;
150 ///The type of the paths.
151 typedef PredMapPath<Digraph, PredMap> Path;
158 typedef typename Digraph::Node Node;
159 typedef typename Digraph::NodeIt NodeIt;
160 typedef typename Digraph::Arc Arc;
161 typedef typename Digraph::OutArcIt OutArcIt;
163 //Pointer to the underlying digraph.
165 //Pointer to the map of predecessor arcs.
167 //Indicates if _pred is locally allocated (true) or not.
169 //Pointer to the map of distances.
171 //Indicates if _dist is locally allocated (true) or not.
173 //Pointer to the map of reached status of the nodes.
174 ReachedMap *_reached;
175 //Indicates if _reached is locally allocated (true) or not.
177 //Pointer to the map of processed status of the nodes.
178 ProcessedMap *_processed;
179 //Indicates if _processed is locally allocated (true) or not.
180 bool local_processed;
182 std::vector<typename Digraph::Node> _queue;
183 int _queue_head,_queue_tail,_queue_next_dist;
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 Bfs< Digraph, SetPredMapTraits<T> > {
235 typedef Bfs< 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 Bfs< Digraph, SetDistMapTraits<T> > {
254 typedef Bfs< 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 Bfs< Digraph, SetReachedMapTraits<T> > {
273 typedef Bfs< 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 Bfs< Digraph, SetProcessedMapTraits<T> > {
292 typedef Bfs< 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);
300 return 0; // ignore warnings
303 ///\brief \ref named-templ-param "Named parameter" for setting
304 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
306 ///\ref named-templ-param "Named parameter" for setting
307 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
308 ///If you don't set it explicitly, it will be automatically allocated.
309 struct SetStandardProcessedMap :
310 public Bfs< Digraph, SetStandardProcessedMapTraits > {
311 typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
321 ///\param g The digraph the algorithm runs on.
322 Bfs(const Digraph &g) :
324 _pred(NULL), local_pred(false),
325 _dist(NULL), local_dist(false),
326 _reached(NULL), local_reached(false),
327 _processed(NULL), local_processed(false)
333 if(local_pred) delete _pred;
334 if(local_dist) delete _dist;
335 if(local_reached) delete _reached;
336 if(local_processed) delete _processed;
339 ///Sets the map that stores the predecessor arcs.
341 ///Sets the map that stores the predecessor arcs.
342 ///If you don't use this function before calling \ref run(),
343 ///it will allocate one. The destructor deallocates this
344 ///automatically allocated map, of course.
345 ///\return <tt> (*this) </tt>
346 Bfs &predMap(PredMap &m)
356 ///Sets the map that indicates which nodes are reached.
358 ///Sets the map that indicates which nodes are reached.
359 ///If you don't use this function before calling \ref run(),
360 ///it will allocate one. The destructor deallocates this
361 ///automatically allocated map, of course.
362 ///\return <tt> (*this) </tt>
363 Bfs &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(),
377 ///it will allocate one. The destructor deallocates this
378 ///automatically allocated map, of course.
379 ///\return <tt> (*this) </tt>
380 Bfs &processedMap(ProcessedMap &m)
382 if(local_processed) {
384 local_processed=false;
390 ///Sets the map that stores the distances of the nodes.
392 ///Sets the map that stores the distances of the nodes calculated by
394 ///If you don't use this function before calling \ref run(),
395 ///it will allocate one. The destructor deallocates this
396 ///automatically allocated map, of course.
397 ///\return <tt> (*this) </tt>
398 Bfs &distMap(DistMap &m)
410 ///\name Execution control
411 ///The simplest way to execute the algorithm is to use
412 ///one of the member functions called \ref lemon::Bfs::run() "run()".
414 ///If you need more control on the execution, first you must call
415 ///\ref lemon::Bfs::init() "init()", then you can add several source
416 ///nodes with \ref lemon::Bfs::addSource() "addSource()".
417 ///Finally \ref lemon::Bfs::start() "start()" will perform the
418 ///actual path computation.
422 ///Initializes the internal data structures.
424 ///Initializes the internal data structures.
429 _queue.resize(countNodes(*G));
430 _queue_head=_queue_tail=0;
432 for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
433 _pred->set(u,INVALID);
434 _reached->set(u,false);
435 _processed->set(u,false);
439 ///Adds a new source node.
441 ///Adds a new source node to the set of nodes to be processed.
443 void addSource(Node s)
447 _reached->set(s,true);
448 _pred->set(s,INVALID);
450 _queue[_queue_head++]=s;
451 _queue_next_dist=_queue_head;
455 ///Processes the next node.
457 ///Processes the next node.
459 ///\return The processed node.
461 ///\pre The queue must not be empty.
462 Node processNextNode()
464 if(_queue_tail==_queue_next_dist) {
466 _queue_next_dist=_queue_head;
468 Node n=_queue[_queue_tail++];
469 _processed->set(n,true);
471 for(OutArcIt e(*G,n);e!=INVALID;++e)
472 if(!(*_reached)[m=G->target(e)]) {
473 _queue[_queue_head++]=m;
474 _reached->set(m,true);
476 _dist->set(m,_curr_dist);
481 ///Processes the next node.
483 ///Processes the next node and checks if the given target node
484 ///is reached. If the target node is reachable from the processed
485 ///node, then the \c reach parameter will be set to \c true.
487 ///\param target The target node.
488 ///\retval reach Indicates if the target node is reached.
489 ///It should be initially \c false.
491 ///\return The processed node.
493 ///\pre The queue must not be empty.
494 Node processNextNode(Node target, bool& reach)
496 if(_queue_tail==_queue_next_dist) {
498 _queue_next_dist=_queue_head;
500 Node n=_queue[_queue_tail++];
501 _processed->set(n,true);
503 for(OutArcIt e(*G,n);e!=INVALID;++e)
504 if(!(*_reached)[m=G->target(e)]) {
505 _queue[_queue_head++]=m;
506 _reached->set(m,true);
508 _dist->set(m,_curr_dist);
509 reach = reach || (target == m);
514 ///Processes the next node.
516 ///Processes the next node and checks if at least one of reached
517 ///nodes has \c true value in the \c nm node map. If one node
518 ///with \c true value is reachable from the processed node, then the
519 ///\c rnode parameter will be set to the first of such nodes.
521 ///\param nm A \c bool (or convertible) node map that indicates the
523 ///\retval rnode The reached target node.
524 ///It should be initially \c INVALID.
526 ///\return The processed node.
528 ///\pre The queue must not be empty.
530 Node processNextNode(const NM& nm, Node& rnode)
532 if(_queue_tail==_queue_next_dist) {
534 _queue_next_dist=_queue_head;
536 Node n=_queue[_queue_tail++];
537 _processed->set(n,true);
539 for(OutArcIt e(*G,n);e!=INVALID;++e)
540 if(!(*_reached)[m=G->target(e)]) {
541 _queue[_queue_head++]=m;
542 _reached->set(m,true);
544 _dist->set(m,_curr_dist);
545 if (nm[m] && rnode == INVALID) rnode = m;
550 ///The next node to be processed.
552 ///Returns the next node to be processed or \c INVALID if the queue
554 Node nextNode() const
556 return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
559 ///\brief Returns \c false if there are nodes
562 ///Returns \c false if there are nodes
563 ///to be processed in the queue.
564 bool emptyQueue() const { return _queue_tail==_queue_head; }
566 ///Returns the number of the nodes to be processed.
568 ///Returns the number of the nodes to be processed in the queue.
569 int queueSize() const { return _queue_head-_queue_tail; }
571 ///Executes the algorithm.
573 ///Executes the algorithm.
575 ///This method runs the %BFS algorithm from the root node(s)
576 ///in order to compute the shortest path to each node.
578 ///The algorithm computes
579 ///- the shortest path tree (forest),
580 ///- the distance of each node from the root(s).
582 ///\pre init() must be called and at least one root node should be
583 ///added with addSource() before using this function.
585 ///\note <tt>b.start()</tt> is just a shortcut of the following code.
587 /// while ( !b.emptyQueue() ) {
588 /// b.processNextNode();
593 while ( !emptyQueue() ) processNextNode();
596 ///Executes the algorithm until the given target node is reached.
598 ///Executes the algorithm until the given target node is reached.
600 ///This method runs the %BFS algorithm from the root node(s)
601 ///in order to compute the shortest path to \c t.
603 ///The algorithm computes
604 ///- the shortest path to \c t,
605 ///- the distance of \c t from the root(s).
607 ///\pre init() must be called and at least one root node should be
608 ///added with addSource() before using this function.
610 ///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
612 /// bool reach = false;
613 /// while ( !b.emptyQueue() && !reach ) {
614 /// b.processNextNode(t, reach);
620 while ( !emptyQueue() && !reach ) processNextNode(t, reach);
623 ///Executes the algorithm until a condition is met.
625 ///Executes the algorithm until a condition is met.
627 ///This method runs the %BFS algorithm from the root node(s) in
628 ///order to compute the shortest path to a node \c v with
629 /// <tt>nm[v]</tt> true, if such a node can be found.
631 ///\param nm A \c bool (or convertible) node map. The algorithm
632 ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
634 ///\return The reached node \c v with <tt>nm[v]</tt> true or
635 ///\c INVALID if no such node was found.
637 ///\pre init() must be called and at least one root node should be
638 ///added with addSource() before using this function.
640 ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
642 /// Node rnode = INVALID;
643 /// while ( !b.emptyQueue() && rnode == INVALID ) {
644 /// b.processNextNode(nm, rnode);
648 template<class NodeBoolMap>
649 Node start(const NodeBoolMap &nm)
651 Node rnode = INVALID;
652 while ( !emptyQueue() && rnode == INVALID ) {
653 processNextNode(nm, rnode);
658 ///Runs the algorithm from the given source node.
660 ///This method runs the %BFS algorithm from node \c s
661 ///in order to compute the shortest path to each node.
663 ///The algorithm computes
664 ///- the shortest path tree,
665 ///- the distance of each node from the root.
667 ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
679 ///Finds the shortest path between \c s and \c t.
681 ///This method runs the %BFS algorithm from node \c s
682 ///in order to compute the shortest path to node \c t
683 ///(it stops searching when \c t is processed).
685 ///\return \c true if \c t is reachable form \c s.
687 ///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
688 ///shortcut of the following code.
694 bool run(Node s,Node t) {
701 ///Runs the algorithm to visit all nodes in the digraph.
703 ///This method runs the %BFS algorithm in order to
704 ///compute the shortest path to each node.
706 ///The algorithm computes
707 ///- the shortest path tree (forest),
708 ///- the distance of each node from the root(s).
710 ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
713 /// for (NodeIt n(gr); n != INVALID; ++n) {
714 /// if (!b.reached(n)) {
722 for (NodeIt n(*G); n != INVALID; ++n) {
732 ///\name Query Functions
733 ///The result of the %BFS algorithm can be obtained using these
735 ///Either \ref lemon::Bfs::run() "run()" or \ref lemon::Bfs::start()
736 ///"start()" must be called before using them.
740 ///The shortest path to a node.
742 ///Returns the shortest path to a node.
744 ///\warning \c t should be reachable from the root(s).
746 ///\pre Either \ref run() or \ref start() must be called before
747 ///using this function.
748 Path path(Node t) const { return Path(*G, *_pred, t); }
750 ///The distance of a node from the root(s).
752 ///Returns the distance of a node from the root(s).
754 ///\warning If node \c v is not reachable from the root(s), then
755 ///the return value of this function is undefined.
757 ///\pre Either \ref run() or \ref start() must be called before
758 ///using this function.
759 int dist(Node v) const { return (*_dist)[v]; }
761 ///Returns the 'previous arc' of the shortest path tree for a node.
763 ///This function returns the 'previous arc' of the shortest path
764 ///tree for the node \c v, i.e. it returns the last arc of a
765 ///shortest path from the root(s) to \c v. It is \c INVALID if \c v
766 ///is not reachable from the root(s) or if \c v is a root.
768 ///The shortest path tree used here is equal to the shortest path
769 ///tree used in \ref predNode().
771 ///\pre Either \ref run() or \ref start() must be called before
772 ///using this function.
773 Arc predArc(Node v) const { return (*_pred)[v];}
775 ///Returns the 'previous node' of the shortest path tree for a node.
777 ///This function returns the 'previous node' of the shortest path
778 ///tree for the node \c v, i.e. it returns the last but one node
779 ///from a shortest path from the root(s) to \c v. It is \c INVALID
780 ///if \c v is not reachable from the root(s) or if \c v is a root.
782 ///The shortest path tree used here is equal to the shortest path
783 ///tree used in \ref predArc().
785 ///\pre Either \ref run() or \ref start() must be called before
786 ///using this function.
787 Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
788 G->source((*_pred)[v]); }
790 ///\brief Returns a const reference to the node map that stores the
791 /// distances of the nodes.
793 ///Returns a const reference to the node map that stores the distances
794 ///of the nodes calculated by the algorithm.
796 ///\pre Either \ref run() or \ref init()
797 ///must be called before using this function.
798 const DistMap &distMap() const { return *_dist;}
800 ///\brief Returns a const reference to the node map that stores the
803 ///Returns a const reference to the node map that stores the predecessor
804 ///arcs, which form the shortest path tree.
806 ///\pre Either \ref run() or \ref init()
807 ///must be called before using this function.
808 const PredMap &predMap() const { return *_pred;}
810 ///Checks if a node is reachable from the root(s).
812 ///Returns \c true if \c v is reachable from the root(s).
813 ///\pre Either \ref run() or \ref start()
814 ///must be called before using this function.
815 bool reached(Node v) const { return (*_reached)[v]; }
820 ///Default traits class of bfs() function.
822 ///Default traits class of bfs() function.
823 ///\tparam GR Digraph type.
825 struct BfsWizardDefaultTraits
827 ///The type of the digraph the algorithm runs on.
830 ///\brief The type of the map that stores the predecessor
831 ///arcs of the shortest paths.
833 ///The type of the map that stores the predecessor
834 ///arcs of the shortest paths.
835 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
836 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
837 ///Instantiates a PredMap.
839 ///This function instantiates a PredMap.
840 ///\param g is the digraph, to which we would like to define the
842 static PredMap *createPredMap(const Digraph &g)
844 return new PredMap(g);
847 ///The type of the map that indicates which nodes are processed.
849 ///The type of the map that indicates which nodes are processed.
850 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
851 ///By default it is a NullMap.
852 typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
853 ///Instantiates a ProcessedMap.
855 ///This function instantiates a ProcessedMap.
856 ///\param g is the digraph, to which
857 ///we would like to define the ProcessedMap.
859 static ProcessedMap *createProcessedMap(const Digraph &g)
861 static ProcessedMap *createProcessedMap(const Digraph &)
864 return new ProcessedMap();
867 ///The type of the map that indicates which nodes are reached.
869 ///The type of the map that indicates which nodes are reached.
870 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
871 typedef typename Digraph::template NodeMap<bool> ReachedMap;
872 ///Instantiates a ReachedMap.
874 ///This function instantiates a ReachedMap.
875 ///\param g is the digraph, to which
876 ///we would like to define the ReachedMap.
877 static ReachedMap *createReachedMap(const Digraph &g)
879 return new ReachedMap(g);
882 ///The type of the map that stores the distances of the nodes.
884 ///The type of the map that stores the distances of the nodes.
885 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
886 typedef typename Digraph::template NodeMap<int> DistMap;
887 ///Instantiates a DistMap.
889 ///This function instantiates a DistMap.
890 ///\param g is the digraph, to which we would like to define
892 static DistMap *createDistMap(const Digraph &g)
894 return new DistMap(g);
897 ///The type of the shortest paths.
899 ///The type of the shortest paths.
900 ///It must meet the \ref concepts::Path "Path" concept.
901 typedef lemon::Path<Digraph> Path;
904 /// Default traits class used by BfsWizard
906 /// To make it easier to use Bfs algorithm
907 /// we have created a wizard class.
908 /// This \ref BfsWizard class needs default traits,
909 /// as well as the \ref Bfs class.
910 /// The \ref BfsWizardBase is a class to be the default traits of the
911 /// \ref BfsWizard class.
913 class BfsWizardBase : public BfsWizardDefaultTraits<GR>
916 typedef BfsWizardDefaultTraits<GR> Base;
918 //The type of the nodes in the digraph.
919 typedef typename Base::Digraph::Node Node;
921 //Pointer to the digraph the algorithm runs on.
923 //Pointer to the map of reached nodes.
925 //Pointer to the map of processed nodes.
927 //Pointer to the map of predecessors arcs.
929 //Pointer to the map of distances.
931 //Pointer to the shortest path to the target node.
933 //Pointer to the distance of the target node.
939 /// This constructor does not require parameters, therefore it initiates
940 /// all of the attributes to \c 0.
941 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
942 _dist(0), _path(0), _di(0) {}
946 /// This constructor requires one parameter,
947 /// others are initiated to \c 0.
948 /// \param g The digraph the algorithm runs on.
949 BfsWizardBase(const GR &g) :
950 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
951 _reached(0), _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
955 /// Auxiliary class for the function-type interface of BFS algorithm.
957 /// This auxiliary class is created to implement the
958 /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
959 /// It does not have own \ref run() method, it uses the functions
960 /// and features of the plain \ref Bfs.
962 /// This class should only be used through the \ref bfs() function,
963 /// which makes it easier to use the algorithm.
965 class BfsWizard : public TR
969 ///The type of the digraph the algorithm runs on.
970 typedef typename TR::Digraph Digraph;
972 typedef typename Digraph::Node Node;
973 typedef typename Digraph::NodeIt NodeIt;
974 typedef typename Digraph::Arc Arc;
975 typedef typename Digraph::OutArcIt OutArcIt;
977 ///\brief The type of the map that stores the predecessor
978 ///arcs of the shortest paths.
979 typedef typename TR::PredMap PredMap;
980 ///\brief The type of the map that stores the distances of the nodes.
981 typedef typename TR::DistMap DistMap;
982 ///\brief The type of the map that indicates which nodes are reached.
983 typedef typename TR::ReachedMap ReachedMap;
984 ///\brief The type of the map that indicates which nodes are processed.
985 typedef typename TR::ProcessedMap ProcessedMap;
986 ///The type of the shortest paths
987 typedef typename TR::Path Path;
992 BfsWizard() : TR() {}
994 /// Constructor that requires parameters.
996 /// Constructor that requires parameters.
997 /// These parameters will be the default values for the traits class.
998 /// \param g The digraph the algorithm runs on.
999 BfsWizard(const Digraph &g) :
1003 BfsWizard(const TR &b) : TR(b) {}
1007 ///Runs BFS algorithm from the given source node.
1009 ///This method runs BFS algorithm from node \c s
1010 ///in order to compute the shortest path to each node.
1013 Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1015 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1017 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1019 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1020 if (Base::_processed)
1021 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1028 ///Finds the shortest path between \c s and \c t.
1030 ///This method runs BFS algorithm from node \c s
1031 ///in order to compute the shortest path to node \c t
1032 ///(it stops searching when \c t is processed).
1034 ///\return \c true if \c t is reachable form \c s.
1035 bool run(Node s, Node t)
1037 Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1039 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1044 if (Base::_processed)
1045 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1048 *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1050 *Base::_di = alg.dist(t);
1051 return alg.reached(t);
1054 ///Runs BFS algorithm to visit all nodes in the digraph.
1056 ///This method runs BFS algorithm in order to compute
1057 ///the shortest path to each node.
1064 struct SetPredMapBase : public Base {
1066 static PredMap *createPredMap(const Digraph &) { return 0; };
1067 SetPredMapBase(const TR &b) : TR(b) {}
1069 ///\brief \ref named-func-param "Named parameter"
1070 ///for setting PredMap object.
1072 ///\ref named-func-param "Named parameter"
1073 ///for setting PredMap object.
1075 BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1078 return BfsWizard<SetPredMapBase<T> >(*this);
1082 struct SetReachedMapBase : public Base {
1083 typedef T ReachedMap;
1084 static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1085 SetReachedMapBase(const TR &b) : TR(b) {}
1087 ///\brief \ref named-func-param "Named parameter"
1088 ///for setting ReachedMap object.
1090 /// \ref named-func-param "Named parameter"
1091 ///for setting ReachedMap object.
1093 BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1095 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1096 return BfsWizard<SetReachedMapBase<T> >(*this);
1100 struct SetDistMapBase : public Base {
1102 static DistMap *createDistMap(const Digraph &) { return 0; };
1103 SetDistMapBase(const TR &b) : TR(b) {}
1105 ///\brief \ref named-func-param "Named parameter"
1106 ///for setting DistMap object.
1108 /// \ref named-func-param "Named parameter"
1109 ///for setting DistMap object.
1111 BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1114 return BfsWizard<SetDistMapBase<T> >(*this);
1118 struct SetProcessedMapBase : public Base {
1119 typedef T ProcessedMap;
1120 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1121 SetProcessedMapBase(const TR &b) : TR(b) {}
1123 ///\brief \ref named-func-param "Named parameter"
1124 ///for setting ProcessedMap object.
1126 /// \ref named-func-param "Named parameter"
1127 ///for setting ProcessedMap object.
1129 BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1132 return BfsWizard<SetProcessedMapBase<T> >(*this);
1136 struct SetPathBase : public Base {
1138 SetPathBase(const TR &b) : TR(b) {}
1140 ///\brief \ref named-func-param "Named parameter"
1141 ///for getting the shortest path to the target node.
1143 ///\ref named-func-param "Named parameter"
1144 ///for getting the shortest path to the target node.
1146 BfsWizard<SetPathBase<T> > path(const T &t)
1148 Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1149 return BfsWizard<SetPathBase<T> >(*this);
1152 ///\brief \ref named-func-param "Named parameter"
1153 ///for getting the distance of the target node.
1155 ///\ref named-func-param "Named parameter"
1156 ///for getting the distance of the target node.
1157 BfsWizard dist(const int &d)
1159 Base::_di=const_cast<int*>(&d);
1165 ///Function-type interface for BFS algorithm.
1168 ///Function-type interface for BFS algorithm.
1170 ///This function also has several \ref named-func-param "named parameters",
1171 ///they are declared as the members of class \ref BfsWizard.
1172 ///The following examples show how to use these parameters.
1174 /// // Compute shortest path from node s to each node
1175 /// bfs(g).predMap(preds).distMap(dists).run(s);
1177 /// // Compute shortest path from s to t
1178 /// bool reached = bfs(g).path(p).dist(d).run(s,t);
1180 ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
1181 ///to the end of the parameter list.
1185 BfsWizard<BfsWizardBase<GR> >
1186 bfs(const GR &digraph)
1188 return BfsWizard<BfsWizardBase<GR> >(digraph);
1192 /// \brief Visitor class for BFS.
1194 /// This class defines the interface of the BfsVisit events, and
1195 /// it could be the base of a real visitor class.
1196 template <typename _Digraph>
1198 typedef _Digraph Digraph;
1199 typedef typename Digraph::Arc Arc;
1200 typedef typename Digraph::Node Node;
1201 /// \brief Called for the source node(s) of the BFS.
1203 /// This function is called for the source node(s) of the BFS.
1204 void start(const Node& node) {}
1205 /// \brief Called when a node is reached first time.
1207 /// This function is called when a node is reached first time.
1208 void reach(const Node& node) {}
1209 /// \brief Called when a node is processed.
1211 /// This function is called when a node is processed.
1212 void process(const Node& node) {}
1213 /// \brief Called when an arc reaches a new node.
1215 /// This function is called when the BFS finds an arc whose target node
1216 /// is not reached yet.
1217 void discover(const Arc& arc) {}
1218 /// \brief Called when an arc is examined but its target node is
1219 /// already discovered.
1221 /// This function is called when an arc is examined but its target node is
1222 /// already discovered.
1223 void examine(const Arc& arc) {}
1226 template <typename _Digraph>
1228 typedef _Digraph Digraph;
1229 typedef typename Digraph::Arc Arc;
1230 typedef typename Digraph::Node Node;
1231 void start(const Node&) {}
1232 void reach(const Node&) {}
1233 void process(const Node&) {}
1234 void discover(const Arc&) {}
1235 void examine(const Arc&) {}
1237 template <typename _Visitor>
1238 struct Constraints {
1239 void constraints() {
1242 visitor.start(node);
1243 visitor.reach(node);
1244 visitor.process(node);
1245 visitor.discover(arc);
1246 visitor.examine(arc);
1253 /// \brief Default traits class of BfsVisit class.
1255 /// Default traits class of BfsVisit class.
1256 /// \tparam _Digraph The type of the digraph the algorithm runs on.
1257 template<class _Digraph>
1258 struct BfsVisitDefaultTraits {
1260 /// \brief The type of the digraph the algorithm runs on.
1261 typedef _Digraph Digraph;
1263 /// \brief The type of the map that indicates which nodes are reached.
1265 /// The type of the map that indicates which nodes are reached.
1266 /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1267 typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 /// \brief Instantiates a ReachedMap.
1271 /// This function instantiates a ReachedMap.
1272 /// \param digraph is the digraph, to which
1273 /// we would like to define the ReachedMap.
1274 static ReachedMap *createReachedMap(const Digraph &digraph) {
1275 return new ReachedMap(digraph);
1282 /// \brief %BFS algorithm class with visitor interface.
1284 /// This class provides an efficient implementation of the %BFS algorithm
1285 /// with visitor interface.
1287 /// The %BfsVisit class provides an alternative interface to the Bfs
1288 /// class. It works with callback mechanism, the BfsVisit object calls
1289 /// the member functions of the \c Visitor class on every BFS event.
1291 /// This interface of the BFS algorithm should be used in special cases
1292 /// when extra actions have to be performed in connection with certain
1293 /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1296 /// \tparam _Digraph The type of the digraph the algorithm runs on.
1297 /// The default value is
1298 /// \ref ListDigraph. The value of _Digraph is not used directly by
1299 /// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
1300 /// \tparam _Visitor The Visitor type that is used by the algorithm.
1301 /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
1302 /// does not observe the BFS events. If you want to observe the BFS
1303 /// events, you should implement your own visitor class.
1304 /// \tparam _Traits Traits class to set various data types used by the
1305 /// algorithm. The default traits class is
1306 /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1307 /// See \ref BfsVisitDefaultTraits for the documentation of
1308 /// a BFS visit traits class.
1310 template <typename _Digraph, typename _Visitor, typename _Traits>
1312 template <typename _Digraph = ListDigraph,
1313 typename _Visitor = BfsVisitor<_Digraph>,
1314 typename _Traits = BfsVisitDefaultTraits<_Digraph> >
1319 ///The traits class.
1320 typedef _Traits Traits;
1322 ///The type of the digraph the algorithm runs on.
1323 typedef typename Traits::Digraph Digraph;
1325 ///The visitor type used by the algorithm.
1326 typedef _Visitor Visitor;
1328 ///The type of the map that indicates which nodes are reached.
1329 typedef typename Traits::ReachedMap ReachedMap;
1333 typedef typename Digraph::Node Node;
1334 typedef typename Digraph::NodeIt NodeIt;
1335 typedef typename Digraph::Arc Arc;
1336 typedef typename Digraph::OutArcIt OutArcIt;
1338 //Pointer to the underlying digraph.
1339 const Digraph *_digraph;
1340 //Pointer to the visitor object.
1342 //Pointer to the map of reached status of the nodes.
1343 ReachedMap *_reached;
1344 //Indicates if _reached is locally allocated (true) or not.
1347 std::vector<typename Digraph::Node> _list;
1348 int _list_front, _list_back;
1350 //Creates the maps if necessary.
1351 void create_maps() {
1353 local_reached = true;
1354 _reached = Traits::createReachedMap(*_digraph);
1364 typedef BfsVisit Create;
1366 /// \name Named template parameters
1370 struct SetReachedMapTraits : public Traits {
1371 typedef T ReachedMap;
1372 static ReachedMap *createReachedMap(const Digraph &digraph) {
1373 LEMON_ASSERT(false, "ReachedMap is not initialized");
1374 return 0; // ignore warnings
1377 /// \brief \ref named-templ-param "Named parameter" for setting
1378 /// ReachedMap type.
1380 /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1382 struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1383 SetReachedMapTraits<T> > {
1384 typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1390 /// \brief Constructor.
1394 /// \param digraph The digraph the algorithm runs on.
1395 /// \param visitor The visitor object of the algorithm.
1396 BfsVisit(const Digraph& digraph, Visitor& visitor)
1397 : _digraph(&digraph), _visitor(&visitor),
1398 _reached(0), local_reached(false) {}
1400 /// \brief Destructor.
1402 if(local_reached) delete _reached;
1405 /// \brief Sets the map that indicates which nodes are reached.
1407 /// Sets the map that indicates which nodes are reached.
1408 /// If you don't use this function before calling \ref run(),
1409 /// it will allocate one. The destructor deallocates this
1410 /// automatically allocated map, of course.
1411 /// \return <tt> (*this) </tt>
1412 BfsVisit &reachedMap(ReachedMap &m) {
1415 local_reached = false;
1423 /// \name Execution control
1424 /// The simplest way to execute the algorithm is to use
1425 /// one of the member functions called \ref lemon::BfsVisit::run()
1428 /// If you need more control on the execution, first you must call
1429 /// \ref lemon::BfsVisit::init() "init()", then you can add several
1430 /// source nodes with \ref lemon::BfsVisit::addSource() "addSource()".
1431 /// Finally \ref lemon::BfsVisit::start() "start()" will perform the
1432 /// actual path computation.
1436 /// \brief Initializes the internal data structures.
1438 /// Initializes the internal data structures.
1441 _list.resize(countNodes(*_digraph));
1442 _list_front = _list_back = -1;
1443 for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1444 _reached->set(u, false);
1448 /// \brief Adds a new source node.
1450 /// Adds a new source node to the set of nodes to be processed.
1451 void addSource(Node s) {
1452 if(!(*_reached)[s]) {
1453 _reached->set(s,true);
1456 _list[++_list_back] = s;
1460 /// \brief Processes the next node.
1462 /// Processes the next node.
1464 /// \return The processed node.
1466 /// \pre The queue must not be empty.
1467 Node processNextNode() {
1468 Node n = _list[++_list_front];
1469 _visitor->process(n);
1471 for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1472 Node m = _digraph->target(e);
1473 if (!(*_reached)[m]) {
1474 _visitor->discover(e);
1476 _reached->set(m, true);
1477 _list[++_list_back] = m;
1479 _visitor->examine(e);
1485 /// \brief Processes the next node.
1487 /// Processes the next node and checks if the given target node
1488 /// is reached. If the target node is reachable from the processed
1489 /// node, then the \c reach parameter will be set to \c true.
1491 /// \param target The target node.
1492 /// \retval reach Indicates if the target node is reached.
1493 /// It should be initially \c false.
1495 /// \return The processed node.
1497 /// \pre The queue must not be empty.
1498 Node processNextNode(Node target, bool& reach) {
1499 Node n = _list[++_list_front];
1500 _visitor->process(n);
1502 for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1503 Node m = _digraph->target(e);
1504 if (!(*_reached)[m]) {
1505 _visitor->discover(e);
1507 _reached->set(m, true);
1508 _list[++_list_back] = m;
1509 reach = reach || (target == m);
1511 _visitor->examine(e);
1517 /// \brief Processes the next node.
1519 /// Processes the next node and checks if at least one of reached
1520 /// nodes has \c true value in the \c nm node map. If one node
1521 /// with \c true value is reachable from the processed node, then the
1522 /// \c rnode parameter will be set to the first of such nodes.
1524 /// \param nm A \c bool (or convertible) node map that indicates the
1525 /// possible targets.
1526 /// \retval rnode The reached target node.
1527 /// It should be initially \c INVALID.
1529 /// \return The processed node.
1531 /// \pre The queue must not be empty.
1532 template <typename NM>
1533 Node processNextNode(const NM& nm, Node& rnode) {
1534 Node n = _list[++_list_front];
1535 _visitor->process(n);
1537 for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1538 Node m = _digraph->target(e);
1539 if (!(*_reached)[m]) {
1540 _visitor->discover(e);
1542 _reached->set(m, true);
1543 _list[++_list_back] = m;
1544 if (nm[m] && rnode == INVALID) rnode = m;
1546 _visitor->examine(e);
1552 /// \brief The next node to be processed.
1554 /// Returns the next node to be processed or \c INVALID if the queue
1556 Node nextNode() const {
1557 return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1560 /// \brief Returns \c false if there are nodes
1561 /// to be processed.
1563 /// Returns \c false if there are nodes
1564 /// to be processed in the queue.
1565 bool emptyQueue() const { return _list_front == _list_back; }
1567 /// \brief Returns the number of the nodes to be processed.
1569 /// Returns the number of the nodes to be processed in the queue.
1570 int queueSize() const { return _list_back - _list_front; }
1572 /// \brief Executes the algorithm.
1574 /// Executes the algorithm.
1576 /// This method runs the %BFS algorithm from the root node(s)
1577 /// in order to compute the shortest path to each node.
1579 /// The algorithm computes
1580 /// - the shortest path tree (forest),
1581 /// - the distance of each node from the root(s).
1583 /// \pre init() must be called and at least one root node should be added
1584 /// with addSource() before using this function.
1586 /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1588 /// while ( !b.emptyQueue() ) {
1589 /// b.processNextNode();
1593 while ( !emptyQueue() ) processNextNode();
1596 /// \brief Executes the algorithm until the given target node is reached.
1598 /// Executes the algorithm until the given target node is reached.
1600 /// This method runs the %BFS algorithm from the root node(s)
1601 /// in order to compute the shortest path to \c t.
1603 /// The algorithm computes
1604 /// - the shortest path to \c t,
1605 /// - the distance of \c t from the root(s).
1607 /// \pre init() must be called and at least one root node should be
1608 /// added with addSource() before using this function.
1610 /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1612 /// bool reach = false;
1613 /// while ( !b.emptyQueue() && !reach ) {
1614 /// b.processNextNode(t, reach);
1617 void start(Node t) {
1619 while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1622 /// \brief Executes the algorithm until a condition is met.
1624 /// Executes the algorithm until a condition is met.
1626 /// This method runs the %BFS algorithm from the root node(s) in
1627 /// order to compute the shortest path to a node \c v with
1628 /// <tt>nm[v]</tt> true, if such a node can be found.
1630 /// \param nm must be a bool (or convertible) node map. The
1631 /// algorithm will stop when it reaches a node \c v with
1632 /// <tt>nm[v]</tt> true.
1634 /// \return The reached node \c v with <tt>nm[v]</tt> true or
1635 /// \c INVALID if no such node was found.
1637 /// \pre init() must be called and at least one root node should be
1638 /// added with addSource() before using this function.
1640 /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1642 /// Node rnode = INVALID;
1643 /// while ( !b.emptyQueue() && rnode == INVALID ) {
1644 /// b.processNextNode(nm, rnode);
1648 template <typename NM>
1649 Node start(const NM &nm) {
1650 Node rnode = INVALID;
1651 while ( !emptyQueue() && rnode == INVALID ) {
1652 processNextNode(nm, rnode);
1657 /// \brief Runs the algorithm from the given source node.
1659 /// This method runs the %BFS algorithm from node \c s
1660 /// in order to compute the shortest path to each node.
1662 /// The algorithm computes
1663 /// - the shortest path tree,
1664 /// - the distance of each node from the root.
1666 /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1678 /// \brief Finds the shortest path between \c s and \c t.
1680 /// This method runs the %BFS algorithm from node \c s
1681 /// in order to compute the shortest path to node \c t
1682 /// (it stops searching when \c t is processed).
1684 /// \return \c true if \c t is reachable form \c s.
1686 /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1687 /// shortcut of the following code.
1693 bool run(Node s,Node t) {
1700 /// \brief Runs the algorithm to visit all nodes in the digraph.
1702 /// This method runs the %BFS algorithm in order to
1703 /// compute the shortest path to each node.
1705 /// The algorithm computes
1706 /// - the shortest path tree (forest),
1707 /// - the distance of each node from the root(s).
1709 /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1712 /// for (NodeIt n(gr); n != INVALID; ++n) {
1713 /// if (!b.reached(n)) {
1721 for (NodeIt it(*_digraph); it != INVALID; ++it) {
1731 /// \name Query Functions
1732 /// The result of the %BFS algorithm can be obtained using these
1734 /// Either \ref lemon::BfsVisit::run() "run()" or
1735 /// \ref lemon::BfsVisit::start() "start()" must be called before
1739 /// \brief Checks if a node is reachable from the root(s).
1741 /// Returns \c true if \c v is reachable from the root(s).
1742 /// \pre Either \ref run() or \ref start()
1743 /// must be called before using this function.
1744 bool reached(Node v) { return (*_reached)[v]; }
1750 } //END OF NAMESPACE LEMON