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 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.
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 ///%BFS algorithm class.
115 ///This class provides an efficient implementation of the %BFS algorithm.
117 ///There is also a \ref bfs() "function-type interface" for the BFS
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 type is \ref ListDigraph.
124 template <typename GR,
127 template <typename GR=ListDigraph,
128 typename TR=BfsDefaultTraits<GR> >
133 ///The type of the digraph the algorithm runs on.
134 typedef typename TR::Digraph Digraph;
136 ///\brief The type of the map that stores the predecessor arcs of the
138 typedef typename TR::PredMap PredMap;
139 ///The type of the map that stores the distances of the nodes.
140 typedef typename TR::DistMap DistMap;
141 ///The type of the map that indicates which nodes are reached.
142 typedef typename TR::ReachedMap ReachedMap;
143 ///The type of the map that indicates which nodes are processed.
144 typedef typename TR::ProcessedMap ProcessedMap;
145 ///The type of the paths.
146 typedef PredMapPath<Digraph, PredMap> Path;
148 ///The \ref BfsDefaultTraits "traits class" of the algorithm.
153 typedef typename Digraph::Node Node;
154 typedef typename Digraph::NodeIt NodeIt;
155 typedef typename Digraph::Arc Arc;
156 typedef typename Digraph::OutArcIt OutArcIt;
158 //Pointer to the underlying digraph.
160 //Pointer to the map of predecessor arcs.
162 //Indicates if _pred is locally allocated (true) or not.
164 //Pointer to the map of distances.
166 //Indicates if _dist is locally allocated (true) or not.
168 //Pointer to the map of reached status of the nodes.
169 ReachedMap *_reached;
170 //Indicates if _reached is locally allocated (true) or not.
172 //Pointer to the map of processed status of the nodes.
173 ProcessedMap *_processed;
174 //Indicates if _processed is locally allocated (true) or not.
175 bool local_processed;
177 std::vector<typename Digraph::Node> _queue;
178 int _queue_head,_queue_tail,_queue_next_dist;
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 meet the \ref concepts::WriteMap "WriteMap" concept.
230 struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 typedef Bfs< 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 meet the \ref concepts::WriteMap "WriteMap" concept.
250 struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
251 typedef Bfs< 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
266 ///\ref named-templ-param "Named parameter" for setting
268 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
270 struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
271 typedef Bfs< 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 ///ProcessedMap type.
286 ///\ref named-templ-param "Named parameter" for setting
287 ///ProcessedMap type.
288 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
290 struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
291 typedef Bfs< 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);
299 return 0; // ignore warnings
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 Bfs< Digraph, SetStandardProcessedMapTraits > {
310 typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
320 ///\param g The digraph the algorithm runs on.
321 Bfs(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(Node) "run()"
342 ///or \ref init(), an instance will be allocated automatically.
343 ///The destructor deallocates this automatically allocated map,
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(Node) "run()"
360 ///or \ref init(), an instance will be allocated automatically.
361 ///The destructor deallocates this automatically allocated map,
363 ///\return <tt> (*this) </tt>
364 Bfs &reachedMap(ReachedMap &m)
374 ///Sets the map that indicates which nodes are processed.
376 ///Sets the map that indicates which nodes are processed.
377 ///If you don't use this function before calling \ref run(Node) "run()"
378 ///or \ref init(), an instance will be allocated automatically.
379 ///The destructor deallocates this automatically allocated map,
381 ///\return <tt> (*this) </tt>
382 Bfs &processedMap(ProcessedMap &m)
384 if(local_processed) {
386 local_processed=false;
392 ///Sets the map that stores the distances of the nodes.
394 ///Sets the map that stores the distances of the nodes calculated by
396 ///If you don't use this function before calling \ref run(Node) "run()"
397 ///or \ref init(), an instance will be allocated automatically.
398 ///The destructor deallocates this automatically allocated map,
400 ///\return <tt> (*this) </tt>
401 Bfs &distMap(DistMap &m)
413 ///\name Execution Control
414 ///The simplest way to execute the BFS algorithm is to use one of the
415 ///member functions called \ref run(Node) "run()".\n
416 ///If you need more control on the execution, first you have to call
417 ///\ref init(), then you can add several source nodes with
418 ///\ref addSource(). Finally the actual path computation can be
419 ///performed with one of the \ref start() functions.
423 ///\brief Initializes the internal data structures.
425 ///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 ///Returns \c false if there are nodes to be processed.
561 ///Returns \c false if there are nodes to be processed
563 bool emptyQueue() const { return _queue_tail==_queue_head; }
565 ///Returns the number of the nodes to be processed.
567 ///Returns the number of the nodes to be processed
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 results of the BFS algorithm can be obtained using these
735 ///Either \ref run(Node) "run()" or \ref start() should be called
736 ///before using them.
740 ///The shortest path to a node.
742 ///Returns the shortest path to a node.
744 ///\warning \c t should be reached from the root(s).
746 ///\pre Either \ref run(Node) "run()" or \ref init()
747 ///must be called before 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 reached from the root(s), then
755 ///the return value of this function is undefined.
757 ///\pre Either \ref run(Node) "run()" or \ref init()
758 ///must be called before 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 a root to \c v. It is \c INVALID if \c v
766 ///is not reached 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(Node) "run()" or \ref init()
772 ///must be called before 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 a root to \c v. It is \c INVALID
780 ///if \c v is not reached 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(Node) "run()" or \ref init()
786 ///must be called before 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(Node) "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(Node) "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 reached from the root(s).
812 ///Returns \c true if \c v is reached from the root(s).
814 ///\pre Either \ref run(Node) "run()" or \ref init()
815 ///must be called before using this function.
816 bool reached(Node v) const { return (*_reached)[v]; }
821 ///Default traits class of bfs() function.
823 ///Default traits class of bfs() function.
824 ///\tparam GR Digraph type.
826 struct BfsWizardDefaultTraits
828 ///The type of the digraph the algorithm runs on.
831 ///\brief The type of the map that stores the predecessor
832 ///arcs of the shortest paths.
834 ///The type of the map that stores the predecessor
835 ///arcs of the shortest paths.
836 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
837 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838 ///Instantiates a PredMap.
840 ///This function instantiates a PredMap.
841 ///\param g is the digraph, to which we would like to define the
843 static PredMap *createPredMap(const Digraph &g)
845 return new PredMap(g);
848 ///The type of the map that indicates which nodes are processed.
850 ///The type of the map that indicates which nodes are processed.
851 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
852 ///By default it is a NullMap.
853 typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854 ///Instantiates a ProcessedMap.
856 ///This function instantiates a ProcessedMap.
857 ///\param g is the digraph, to which
858 ///we would like to define the ProcessedMap.
860 static ProcessedMap *createProcessedMap(const Digraph &g)
862 static ProcessedMap *createProcessedMap(const Digraph &)
865 return new ProcessedMap();
868 ///The type of the map that indicates which nodes are reached.
870 ///The type of the map that indicates which nodes are reached.
871 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 typedef typename Digraph::template NodeMap<bool> ReachedMap;
873 ///Instantiates a ReachedMap.
875 ///This function instantiates a ReachedMap.
876 ///\param g is the digraph, to which
877 ///we would like to define the ReachedMap.
878 static ReachedMap *createReachedMap(const Digraph &g)
880 return new ReachedMap(g);
883 ///The type of the map that stores the distances of the nodes.
885 ///The type of the map that stores the distances of the nodes.
886 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
887 typedef typename Digraph::template NodeMap<int> DistMap;
888 ///Instantiates a DistMap.
890 ///This function instantiates a DistMap.
891 ///\param g is the digraph, to which we would like to define
893 static DistMap *createDistMap(const Digraph &g)
895 return new DistMap(g);
898 ///The type of the shortest paths.
900 ///The type of the shortest paths.
901 ///It must meet the \ref concepts::Path "Path" concept.
902 typedef lemon::Path<Digraph> Path;
905 /// Default traits class used by BfsWizard
907 /// To make it easier to use Bfs algorithm
908 /// we have created a wizard class.
909 /// This \ref BfsWizard class needs default traits,
910 /// as well as the \ref Bfs class.
911 /// The \ref BfsWizardBase is a class to be the default traits of the
912 /// \ref BfsWizard class.
914 class BfsWizardBase : public BfsWizardDefaultTraits<GR>
917 typedef BfsWizardDefaultTraits<GR> Base;
919 //The type of the nodes in the digraph.
920 typedef typename Base::Digraph::Node Node;
922 //Pointer to the digraph the algorithm runs on.
924 //Pointer to the map of reached nodes.
926 //Pointer to the map of processed nodes.
928 //Pointer to the map of predecessors arcs.
930 //Pointer to the map of distances.
932 //Pointer to the shortest path to the target node.
934 //Pointer to the distance of the target node.
940 /// This constructor does not require parameters, therefore it initiates
941 /// all of the attributes to \c 0.
942 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 _dist(0), _path(0), _di(0) {}
947 /// This constructor requires one parameter,
948 /// others are initiated to \c 0.
949 /// \param g The digraph the algorithm runs on.
950 BfsWizardBase(const GR &g) :
951 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
952 _reached(0), _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
956 /// Auxiliary class for the function-type interface of BFS algorithm.
958 /// This auxiliary class is created to implement the
959 /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 /// It does not have own \ref run(Node) "run()" method, it uses the
961 /// functions and features of the plain \ref Bfs.
963 /// This class should only be used through the \ref bfs() function,
964 /// which makes it easier to use the algorithm.
966 class BfsWizard : public TR
970 ///The type of the digraph the algorithm runs on.
971 typedef typename TR::Digraph Digraph;
973 typedef typename Digraph::Node Node;
974 typedef typename Digraph::NodeIt NodeIt;
975 typedef typename Digraph::Arc Arc;
976 typedef typename Digraph::OutArcIt OutArcIt;
978 ///\brief The type of the map that stores the predecessor
979 ///arcs of the shortest paths.
980 typedef typename TR::PredMap PredMap;
981 ///\brief The type of the map that stores the distances of the nodes.
982 typedef typename TR::DistMap DistMap;
983 ///\brief The type of the map that indicates which nodes are reached.
984 typedef typename TR::ReachedMap ReachedMap;
985 ///\brief The type of the map that indicates which nodes are processed.
986 typedef typename TR::ProcessedMap ProcessedMap;
987 ///The type of the shortest paths
988 typedef typename TR::Path Path;
993 BfsWizard() : TR() {}
995 /// Constructor that requires parameters.
997 /// Constructor that requires parameters.
998 /// These parameters will be the default values for the traits class.
999 /// \param g The digraph the algorithm runs on.
1000 BfsWizard(const Digraph &g) :
1004 BfsWizard(const TR &b) : TR(b) {}
1008 ///Runs BFS algorithm from the given source node.
1010 ///This method runs BFS algorithm from node \c s
1011 ///in order to compute the shortest path to each node.
1014 Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1016 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1018 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1020 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1021 if (Base::_processed)
1022 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1029 ///Finds the shortest path between \c s and \c t.
1031 ///This method runs BFS algorithm from node \c s
1032 ///in order to compute the shortest path to node \c t
1033 ///(it stops searching when \c t is processed).
1035 ///\return \c true if \c t is reachable form \c s.
1036 bool run(Node s, Node t)
1038 Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1040 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1042 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1044 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1045 if (Base::_processed)
1046 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1049 *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1051 *Base::_di = alg.dist(t);
1052 return alg.reached(t);
1055 ///Runs BFS algorithm to visit all nodes in the digraph.
1057 ///This method runs BFS algorithm in order to compute
1058 ///the shortest path to each node.
1065 struct SetPredMapBase : public Base {
1067 static PredMap *createPredMap(const Digraph &) { return 0; };
1068 SetPredMapBase(const TR &b) : TR(b) {}
1070 ///\brief \ref named-func-param "Named parameter"
1071 ///for setting PredMap object.
1073 ///\ref named-func-param "Named parameter"
1074 ///for setting PredMap object.
1076 BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1078 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 return BfsWizard<SetPredMapBase<T> >(*this);
1083 struct SetReachedMapBase : public Base {
1084 typedef T ReachedMap;
1085 static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1086 SetReachedMapBase(const TR &b) : TR(b) {}
1088 ///\brief \ref named-func-param "Named parameter"
1089 ///for setting ReachedMap object.
1091 /// \ref named-func-param "Named parameter"
1092 ///for setting ReachedMap object.
1094 BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1096 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1097 return BfsWizard<SetReachedMapBase<T> >(*this);
1101 struct SetDistMapBase : public Base {
1103 static DistMap *createDistMap(const Digraph &) { return 0; };
1104 SetDistMapBase(const TR &b) : TR(b) {}
1106 ///\brief \ref named-func-param "Named parameter"
1107 ///for setting DistMap object.
1109 /// \ref named-func-param "Named parameter"
1110 ///for setting DistMap object.
1112 BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1114 Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 return BfsWizard<SetDistMapBase<T> >(*this);
1119 struct SetProcessedMapBase : public Base {
1120 typedef T ProcessedMap;
1121 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 SetProcessedMapBase(const TR &b) : TR(b) {}
1124 ///\brief \ref named-func-param "Named parameter"
1125 ///for setting ProcessedMap object.
1127 /// \ref named-func-param "Named parameter"
1128 ///for setting ProcessedMap object.
1130 BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1132 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 return BfsWizard<SetProcessedMapBase<T> >(*this);
1137 struct SetPathBase : public Base {
1139 SetPathBase(const TR &b) : TR(b) {}
1141 ///\brief \ref named-func-param "Named parameter"
1142 ///for getting the shortest path to the target node.
1144 ///\ref named-func-param "Named parameter"
1145 ///for getting the shortest path to the target node.
1147 BfsWizard<SetPathBase<T> > path(const T &t)
1149 Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1150 return BfsWizard<SetPathBase<T> >(*this);
1153 ///\brief \ref named-func-param "Named parameter"
1154 ///for getting the distance of the target node.
1156 ///\ref named-func-param "Named parameter"
1157 ///for getting the distance of the target node.
1158 BfsWizard dist(const int &d)
1160 Base::_di=const_cast<int*>(&d);
1166 ///Function-type interface for BFS algorithm.
1169 ///Function-type interface for BFS algorithm.
1171 ///This function also has several \ref named-func-param "named parameters",
1172 ///they are declared as the members of class \ref BfsWizard.
1173 ///The following examples show how to use these parameters.
1175 /// // Compute shortest path from node s to each node
1176 /// bfs(g).predMap(preds).distMap(dists).run(s);
1178 /// // Compute shortest path from s to t
1179 /// bool reached = bfs(g).path(p).dist(d).run(s,t);
1181 ///\warning Don't forget to put the \ref BfsWizard::run(Node) "run()"
1182 ///to the end of the parameter list.
1186 BfsWizard<BfsWizardBase<GR> >
1187 bfs(const GR &digraph)
1189 return BfsWizard<BfsWizardBase<GR> >(digraph);
1193 /// \brief Visitor class for BFS.
1195 /// This class defines the interface of the BfsVisit events, and
1196 /// it could be the base of a real visitor class.
1197 template <typename _Digraph>
1199 typedef _Digraph Digraph;
1200 typedef typename Digraph::Arc Arc;
1201 typedef typename Digraph::Node Node;
1202 /// \brief Called for the source node(s) of the BFS.
1204 /// This function is called for the source node(s) of the BFS.
1205 void start(const Node& node) {}
1206 /// \brief Called when a node is reached first time.
1208 /// This function is called when a node is reached first time.
1209 void reach(const Node& node) {}
1210 /// \brief Called when a node is processed.
1212 /// This function is called when a node is processed.
1213 void process(const Node& node) {}
1214 /// \brief Called when an arc reaches a new node.
1216 /// This function is called when the BFS finds an arc whose target node
1217 /// is not reached yet.
1218 void discover(const Arc& arc) {}
1219 /// \brief Called when an arc is examined but its target node is
1220 /// already discovered.
1222 /// This function is called when an arc is examined but its target node is
1223 /// already discovered.
1224 void examine(const Arc& arc) {}
1227 template <typename _Digraph>
1229 typedef _Digraph Digraph;
1230 typedef typename Digraph::Arc Arc;
1231 typedef typename Digraph::Node Node;
1232 void start(const Node&) {}
1233 void reach(const Node&) {}
1234 void process(const Node&) {}
1235 void discover(const Arc&) {}
1236 void examine(const Arc&) {}
1238 template <typename _Visitor>
1239 struct Constraints {
1240 void constraints() {
1243 visitor.start(node);
1244 visitor.reach(node);
1245 visitor.process(node);
1246 visitor.discover(arc);
1247 visitor.examine(arc);
1254 /// \brief Default traits class of BfsVisit class.
1256 /// Default traits class of BfsVisit class.
1257 /// \tparam _Digraph The type of the digraph the algorithm runs on.
1258 template<class _Digraph>
1259 struct BfsVisitDefaultTraits {
1261 /// \brief The type of the digraph the algorithm runs on.
1262 typedef _Digraph Digraph;
1264 /// \brief The type of the map that indicates which nodes are reached.
1266 /// The type of the map that indicates which nodes are reached.
1267 /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 typedef typename Digraph::template NodeMap<bool> ReachedMap;
1270 /// \brief Instantiates a ReachedMap.
1272 /// This function instantiates a ReachedMap.
1273 /// \param digraph is the digraph, to which
1274 /// we would like to define the ReachedMap.
1275 static ReachedMap *createReachedMap(const Digraph &digraph) {
1276 return new ReachedMap(digraph);
1283 /// \brief %BFS algorithm class with visitor interface.
1285 /// This class provides an efficient implementation of the %BFS algorithm
1286 /// with visitor interface.
1288 /// The %BfsVisit class provides an alternative interface to the Bfs
1289 /// class. It works with callback mechanism, the BfsVisit object calls
1290 /// the member functions of the \c Visitor class on every BFS event.
1292 /// This interface of the BFS algorithm should be used in special cases
1293 /// when extra actions have to be performed in connection with certain
1294 /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1297 /// \tparam _Digraph The type of the digraph the algorithm runs on.
1298 /// The default value is
1299 /// \ref ListDigraph. The value of _Digraph is not used directly by
1300 /// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
1301 /// \tparam _Visitor The Visitor type that is used by the algorithm.
1302 /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
1303 /// does not observe the BFS events. If you want to observe the BFS
1304 /// events, you should implement your own visitor class.
1305 /// \tparam _Traits Traits class to set various data types used by the
1306 /// algorithm. The default traits class is
1307 /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1308 /// See \ref BfsVisitDefaultTraits for the documentation of
1309 /// a BFS visit traits class.
1311 template <typename _Digraph, typename _Visitor, typename _Traits>
1313 template <typename _Digraph = ListDigraph,
1314 typename _Visitor = BfsVisitor<_Digraph>,
1315 typename _Traits = BfsVisitDefaultTraits<_Digraph> >
1320 ///The traits class.
1321 typedef _Traits Traits;
1323 ///The type of the digraph the algorithm runs on.
1324 typedef typename Traits::Digraph Digraph;
1326 ///The visitor type used by the algorithm.
1327 typedef _Visitor Visitor;
1329 ///The type of the map that indicates which nodes are reached.
1330 typedef typename Traits::ReachedMap ReachedMap;
1334 typedef typename Digraph::Node Node;
1335 typedef typename Digraph::NodeIt NodeIt;
1336 typedef typename Digraph::Arc Arc;
1337 typedef typename Digraph::OutArcIt OutArcIt;
1339 //Pointer to the underlying digraph.
1340 const Digraph *_digraph;
1341 //Pointer to the visitor object.
1343 //Pointer to the map of reached status of the nodes.
1344 ReachedMap *_reached;
1345 //Indicates if _reached is locally allocated (true) or not.
1348 std::vector<typename Digraph::Node> _list;
1349 int _list_front, _list_back;
1351 //Creates the maps if necessary.
1352 void create_maps() {
1354 local_reached = true;
1355 _reached = Traits::createReachedMap(*_digraph);
1365 typedef BfsVisit Create;
1367 /// \name Named Template Parameters
1371 struct SetReachedMapTraits : public Traits {
1372 typedef T ReachedMap;
1373 static ReachedMap *createReachedMap(const Digraph &digraph) {
1374 LEMON_ASSERT(false, "ReachedMap is not initialized");
1375 return 0; // ignore warnings
1378 /// \brief \ref named-templ-param "Named parameter" for setting
1379 /// ReachedMap type.
1381 /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1383 struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1384 SetReachedMapTraits<T> > {
1385 typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1391 /// \brief Constructor.
1395 /// \param digraph The digraph the algorithm runs on.
1396 /// \param visitor The visitor object of the algorithm.
1397 BfsVisit(const Digraph& digraph, Visitor& visitor)
1398 : _digraph(&digraph), _visitor(&visitor),
1399 _reached(0), local_reached(false) {}
1401 /// \brief Destructor.
1403 if(local_reached) delete _reached;
1406 /// \brief Sets the map that indicates which nodes are reached.
1408 /// Sets the map that indicates which nodes are reached.
1409 /// If you don't use this function before calling \ref run(Node) "run()"
1410 /// or \ref init(), an instance will be allocated automatically.
1411 /// The destructor deallocates this automatically allocated map,
1413 /// \return <tt> (*this) </tt>
1414 BfsVisit &reachedMap(ReachedMap &m) {
1417 local_reached = false;
1425 /// \name Execution Control
1426 /// The simplest way to execute the BFS algorithm is to use one of the
1427 /// member functions called \ref run(Node) "run()".\n
1428 /// If you need more control on the execution, first you have to call
1429 /// \ref init(), then you can add several source nodes with
1430 /// \ref addSource(). Finally the actual path computation can be
1431 /// performed with one of the \ref start() functions.
1435 /// \brief Initializes the internal data structures.
1437 /// Initializes the internal data structures.
1440 _list.resize(countNodes(*_digraph));
1441 _list_front = _list_back = -1;
1442 for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1443 _reached->set(u, false);
1447 /// \brief Adds a new source node.
1449 /// Adds a new source node to the set of nodes to be processed.
1450 void addSource(Node s) {
1451 if(!(*_reached)[s]) {
1452 _reached->set(s,true);
1455 _list[++_list_back] = s;
1459 /// \brief Processes the next node.
1461 /// Processes the next node.
1463 /// \return The processed node.
1465 /// \pre The queue must not be empty.
1466 Node processNextNode() {
1467 Node n = _list[++_list_front];
1468 _visitor->process(n);
1470 for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1471 Node m = _digraph->target(e);
1472 if (!(*_reached)[m]) {
1473 _visitor->discover(e);
1475 _reached->set(m, true);
1476 _list[++_list_back] = m;
1478 _visitor->examine(e);
1484 /// \brief Processes the next node.
1486 /// Processes the next node and checks if the given target node
1487 /// is reached. If the target node is reachable from the processed
1488 /// node, then the \c reach parameter will be set to \c true.
1490 /// \param target The target node.
1491 /// \retval reach Indicates if the target node is reached.
1492 /// It should be initially \c false.
1494 /// \return The processed node.
1496 /// \pre The queue must not be empty.
1497 Node processNextNode(Node target, bool& reach) {
1498 Node n = _list[++_list_front];
1499 _visitor->process(n);
1501 for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1502 Node m = _digraph->target(e);
1503 if (!(*_reached)[m]) {
1504 _visitor->discover(e);
1506 _reached->set(m, true);
1507 _list[++_list_back] = m;
1508 reach = reach || (target == m);
1510 _visitor->examine(e);
1516 /// \brief Processes the next node.
1518 /// Processes the next node and checks if at least one of reached
1519 /// nodes has \c true value in the \c nm node map. If one node
1520 /// with \c true value is reachable from the processed node, then the
1521 /// \c rnode parameter will be set to the first of such nodes.
1523 /// \param nm A \c bool (or convertible) node map that indicates the
1524 /// possible targets.
1525 /// \retval rnode The reached target node.
1526 /// It should be initially \c INVALID.
1528 /// \return The processed node.
1530 /// \pre The queue must not be empty.
1531 template <typename NM>
1532 Node processNextNode(const NM& nm, Node& rnode) {
1533 Node n = _list[++_list_front];
1534 _visitor->process(n);
1536 for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1537 Node m = _digraph->target(e);
1538 if (!(*_reached)[m]) {
1539 _visitor->discover(e);
1541 _reached->set(m, true);
1542 _list[++_list_back] = m;
1543 if (nm[m] && rnode == INVALID) rnode = m;
1545 _visitor->examine(e);
1551 /// \brief The next node to be processed.
1553 /// Returns the next node to be processed or \c INVALID if the queue
1555 Node nextNode() const {
1556 return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1559 /// \brief Returns \c false if there are nodes
1560 /// to be processed.
1562 /// Returns \c false if there are nodes
1563 /// to be processed in the queue.
1564 bool emptyQueue() const { return _list_front == _list_back; }
1566 /// \brief Returns the number of the nodes to be processed.
1568 /// Returns the number of the nodes to be processed in the queue.
1569 int queueSize() const { return _list_back - _list_front; }
1571 /// \brief Executes the algorithm.
1573 /// Executes the algorithm.
1575 /// This method runs the %BFS algorithm from the root node(s)
1576 /// in order to compute the shortest path to each node.
1578 /// The algorithm computes
1579 /// - the shortest path tree (forest),
1580 /// - the distance of each node from the root(s).
1582 /// \pre init() must be called and at least one root node should be added
1583 /// with addSource() before using this function.
1585 /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1587 /// while ( !b.emptyQueue() ) {
1588 /// b.processNextNode();
1592 while ( !emptyQueue() ) processNextNode();
1595 /// \brief Executes the algorithm until the given target node is reached.
1597 /// Executes the algorithm until the given target node is reached.
1599 /// This method runs the %BFS algorithm from the root node(s)
1600 /// in order to compute the shortest path to \c t.
1602 /// The algorithm computes
1603 /// - the shortest path to \c t,
1604 /// - the distance of \c t from the root(s).
1606 /// \pre init() must be called and at least one root node should be
1607 /// added with addSource() before using this function.
1609 /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1611 /// bool reach = false;
1612 /// while ( !b.emptyQueue() && !reach ) {
1613 /// b.processNextNode(t, reach);
1616 void start(Node t) {
1618 while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1621 /// \brief Executes the algorithm until a condition is met.
1623 /// Executes the algorithm until a condition is met.
1625 /// This method runs the %BFS algorithm from the root node(s) in
1626 /// order to compute the shortest path to a node \c v with
1627 /// <tt>nm[v]</tt> true, if such a node can be found.
1629 /// \param nm must be a bool (or convertible) node map. The
1630 /// algorithm will stop when it reaches a node \c v with
1631 /// <tt>nm[v]</tt> true.
1633 /// \return The reached node \c v with <tt>nm[v]</tt> true or
1634 /// \c INVALID if no such node was found.
1636 /// \pre init() must be called and at least one root node should be
1637 /// added with addSource() before using this function.
1639 /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1641 /// Node rnode = INVALID;
1642 /// while ( !b.emptyQueue() && rnode == INVALID ) {
1643 /// b.processNextNode(nm, rnode);
1647 template <typename NM>
1648 Node start(const NM &nm) {
1649 Node rnode = INVALID;
1650 while ( !emptyQueue() && rnode == INVALID ) {
1651 processNextNode(nm, rnode);
1656 /// \brief Runs the algorithm from the given source node.
1658 /// This method runs the %BFS algorithm from node \c s
1659 /// in order to compute the shortest path to each node.
1661 /// The algorithm computes
1662 /// - the shortest path tree,
1663 /// - the distance of each node from the root.
1665 /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1677 /// \brief Finds the shortest path between \c s and \c t.
1679 /// This method runs the %BFS algorithm from node \c s
1680 /// in order to compute the shortest path to node \c t
1681 /// (it stops searching when \c t is processed).
1683 /// \return \c true if \c t is reachable form \c s.
1685 /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1686 /// shortcut of the following code.
1692 bool run(Node s,Node t) {
1699 /// \brief Runs the algorithm to visit all nodes in the digraph.
1701 /// This method runs the %BFS algorithm in order to
1702 /// compute the shortest path to each node.
1704 /// The algorithm computes
1705 /// - the shortest path tree (forest),
1706 /// - the distance of each node from the root(s).
1708 /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1711 /// for (NodeIt n(gr); n != INVALID; ++n) {
1712 /// if (!b.reached(n)) {
1720 for (NodeIt it(*_digraph); it != INVALID; ++it) {
1730 /// \name Query Functions
1731 /// The results of the BFS algorithm can be obtained using these
1733 /// Either \ref run(Node) "run()" or \ref start() should be called
1734 /// before using them.
1738 /// \brief Checks if a node is reached from the root(s).
1740 /// Returns \c true if \c v is reached from the root(s).
1742 /// \pre Either \ref run(Node) "run()" or \ref init()
1743 /// must be called before using this function.
1744 bool reached(Node v) const { return (*_reached)[v]; }
1750 } //END OF NAMESPACE LEMON