3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
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/graph_utils.h>
28 #include <lemon/bits/invalid.h>
29 #include <lemon/error.h>
30 #include <lemon/maps.h>
36 ///Default traits class of Bfs class.
38 ///Default traits class of Bfs class.
39 ///\param GR Graph type.
41 struct BfsDefaultTraits
43 ///The graph type the algorithm runs on.
45 ///\brief The type of the map that stores the last
46 ///edges of the shortest paths.
48 ///The type of the map that stores the last
49 ///edges of the shortest paths.
50 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
52 typedef typename Graph::template NodeMap<typename GR::Edge> PredMap;
53 ///Instantiates a PredMap.
55 ///This function instantiates a \ref PredMap.
56 ///\param G is the graph, to which we would like to define the PredMap.
57 ///\todo The graph alone may be insufficient to initialize
58 static PredMap *createPredMap(const GR &G)
60 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 ///\todo named parameter to set this type, function to read and write.
67 typedef NullMap<typename Graph::Node,bool> ProcessedMap;
68 ///Instantiates a ProcessedMap.
70 ///This function instantiates a \ref ProcessedMap.
71 ///\param g is the graph, to which
72 ///we would like to define the \ref ProcessedMap
74 static ProcessedMap *createProcessedMap(const GR &g)
76 static ProcessedMap *createProcessedMap(const GR &)
79 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::WriteMap "WriteMap" concept.
85 ///\todo named parameter to set this type, function to read and write.
86 typedef typename Graph::template NodeMap<bool> ReachedMap;
87 ///Instantiates a ReachedMap.
89 ///This function instantiates a \ref ReachedMap.
90 ///\param G is the graph, to which
91 ///we would like to define the \ref ReachedMap.
92 static ReachedMap *createReachedMap(const GR &G)
94 return new ReachedMap(G);
96 ///The type of the map that stores the dists of the nodes.
98 ///The type of the map that stores the dists of the nodes.
99 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101 typedef typename Graph::template NodeMap<int> DistMap;
102 ///Instantiates a DistMap.
104 ///This function instantiates a \ref DistMap.
105 ///\param G is the graph, to which we would like to define the \ref DistMap
106 static DistMap *createDistMap(const GR &G)
108 return new DistMap(G);
112 ///%BFS algorithm class.
115 ///This class provides an efficient implementation of the %BFS algorithm.
117 ///\param GR The graph type the algorithm runs on. The default value is
118 ///\ref ListGraph. The value of GR is not used directly by Bfs, it
119 ///is only passed to \ref BfsDefaultTraits.
120 ///\param TR Traits class to set various data types used by the algorithm.
121 ///The default traits class is
122 ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
123 ///See \ref BfsDefaultTraits for the documentation of
124 ///a Bfs traits class.
126 ///\author Alpar Juttner
129 template <typename GR,
132 template <typename GR=ListGraph,
133 typename TR=BfsDefaultTraits<GR> >
138 * \brief \ref Exception for uninitialized parameters.
140 * This error represents problems in the initialization
141 * of the parameters of the algorithms.
143 class UninitializedParameter : public lemon::UninitializedParameter {
145 virtual const char* what() const throw() {
146 return "lemon::Bfs::UninitializedParameter";
151 ///The type of the underlying graph.
152 typedef typename TR::Graph Graph;
154 typedef typename Graph::Node Node;
156 typedef typename Graph::NodeIt NodeIt;
158 typedef typename Graph::Edge Edge;
160 typedef typename Graph::OutEdgeIt OutEdgeIt;
162 ///\brief The type of the map that stores the last
163 ///edges of the shortest paths.
164 typedef typename TR::PredMap PredMap;
165 ///The type of the map indicating which nodes are reached.
166 typedef typename TR::ReachedMap ReachedMap;
167 ///The type of the map indicating which nodes are processed.
168 typedef typename TR::ProcessedMap ProcessedMap;
169 ///The type of the map that stores the dists of the nodes.
170 typedef typename TR::DistMap DistMap;
172 /// Pointer to the underlying graph.
174 ///Pointer to the map of predecessors edges.
176 ///Indicates if \ref _pred is locally allocated (\c true) or not.
178 ///Pointer to the map of distances.
180 ///Indicates if \ref _dist is locally allocated (\c true) or not.
182 ///Pointer to the map of reached status of the nodes.
183 ReachedMap *_reached;
184 ///Indicates if \ref _reached is locally allocated (\c true) or not.
186 ///Pointer to the map of processed status of the nodes.
187 ProcessedMap *_processed;
188 ///Indicates if \ref _processed is locally allocated (\c true) or not.
189 bool local_processed;
191 std::vector<typename Graph::Node> _queue;
192 int _queue_head,_queue_tail,_queue_next_dist;
195 ///Creates the maps if necessary.
197 ///\todo Better memory allocation (instead of new).
202 _pred = Traits::createPredMap(*G);
206 _dist = Traits::createDistMap(*G);
209 local_reached = true;
210 _reached = Traits::createReachedMap(*G);
213 local_processed = true;
214 _processed = Traits::createProcessedMap(*G);
226 ///\name Named template parameters
231 struct DefPredMapTraits : public Traits {
233 static PredMap *createPredMap(const Graph &)
235 throw UninitializedParameter();
238 ///\ref named-templ-param "Named parameter" for setting PredMap type
240 ///\ref named-templ-param "Named parameter" for setting PredMap type
243 struct DefPredMap : public Bfs< Graph, DefPredMapTraits<T> > {
244 typedef Bfs< Graph, DefPredMapTraits<T> > Create;
248 struct DefDistMapTraits : public Traits {
250 static DistMap *createDistMap(const Graph &)
252 throw UninitializedParameter();
255 ///\ref named-templ-param "Named parameter" for setting DistMap type
257 ///\ref named-templ-param "Named parameter" for setting DistMap type
260 struct DefDistMap : public Bfs< Graph, DefDistMapTraits<T> > {
261 typedef Bfs< Graph, DefDistMapTraits<T> > Create;
265 struct DefReachedMapTraits : public Traits {
266 typedef T ReachedMap;
267 static ReachedMap *createReachedMap(const Graph &)
269 throw UninitializedParameter();
272 ///\ref named-templ-param "Named parameter" for setting ReachedMap type
274 ///\ref named-templ-param "Named parameter" for setting ReachedMap type
277 struct DefReachedMap : public Bfs< Graph, DefReachedMapTraits<T> > {
278 typedef Bfs< Graph, DefReachedMapTraits<T> > Create;
282 struct DefProcessedMapTraits : public Traits {
283 typedef T ProcessedMap;
284 static ProcessedMap *createProcessedMap(const Graph &)
286 throw UninitializedParameter();
289 ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
291 ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
294 struct DefProcessedMap : public Bfs< Graph, DefProcessedMapTraits<T> > {
295 typedef Bfs< Graph, DefProcessedMapTraits<T> > Create;
298 struct DefGraphProcessedMapTraits : public Traits {
299 typedef typename Graph::template NodeMap<bool> ProcessedMap;
300 static ProcessedMap *createProcessedMap(const Graph &G)
302 return new ProcessedMap(G);
305 ///\brief \ref named-templ-param "Named parameter"
306 ///for setting the ProcessedMap type to be Graph::NodeMap<bool>.
308 ///\ref named-templ-param "Named parameter"
309 ///for setting the ProcessedMap type to be Graph::NodeMap<bool>.
310 ///If you don't set it explicitly, it will be automatically allocated.
312 struct DefProcessedMapToBeDefaultMap :
313 public Bfs< Graph, DefGraphProcessedMapTraits> {
314 typedef Bfs< Graph, DefGraphProcessedMapTraits> Create;
323 ///\param _G the graph the algorithm will run on.
325 Bfs(const Graph& _G) :
327 _pred(NULL), local_pred(false),
328 _dist(NULL), local_dist(false),
329 _reached(NULL), local_reached(false),
330 _processed(NULL), local_processed(false)
336 if(local_pred) delete _pred;
337 if(local_dist) delete _dist;
338 if(local_reached) delete _reached;
339 if(local_processed) delete _processed;
342 ///Sets the map storing the predecessor edges.
344 ///Sets the map storing the predecessor edges.
345 ///If you don't use this function before calling \ref run(),
346 ///it will allocate one. The destructor deallocates this
347 ///automatically allocated map, of course.
348 ///\return <tt> (*this) </tt>
349 Bfs &predMap(PredMap &m)
359 ///Sets the map indicating the reached nodes.
361 ///Sets the map indicating the reached nodes.
362 ///If you don't use this function before calling \ref run(),
363 ///it will allocate one. The destructor deallocates this
364 ///automatically allocated map, of course.
365 ///\return <tt> (*this) </tt>
366 Bfs &reachedMap(ReachedMap &m)
376 ///Sets the map indicating the processed nodes.
378 ///Sets the map indicating the processed nodes.
379 ///If you don't use this function before calling \ref run(),
380 ///it will allocate one. The destructor deallocates this
381 ///automatically allocated map, of course.
382 ///\return <tt> (*this) </tt>
383 Bfs &processedMap(ProcessedMap &m)
385 if(local_processed) {
387 local_processed=false;
393 ///Sets the map storing the distances calculated by the algorithm.
395 ///Sets the map storing the distances calculated by the algorithm.
396 ///If you don't use this function before calling \ref run(),
397 ///it will allocate one. The destructor deallocates this
398 ///automatically allocated map, of course.
399 ///\return <tt> (*this) </tt>
400 Bfs &distMap(DistMap &m)
411 ///\name Execution control
412 ///The simplest way to execute the algorithm is to use
413 ///one of the member functions called \c run(...).
415 ///If you need more control on the execution,
416 ///first you must call \ref init(), then you can add several source nodes
417 ///with \ref addSource().
418 ///Finally \ref start() will perform the actual path
423 ///Initializes the internal data structures.
425 ///Initializes the internal data structures.
430 _queue.resize(countNodes(*G));
431 _queue_head=_queue_tail=0;
433 for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
434 _pred->set(u,INVALID);
435 _reached->set(u,false);
436 _processed->set(u,false);
440 ///Adds a new source node.
442 ///Adds a new source node to the set of nodes to be processed.
444 void addSource(Node s)
448 _reached->set(s,true);
449 _pred->set(s,INVALID);
451 _queue[_queue_head++]=s;
452 _queue_next_dist=_queue_head;
456 ///Processes the next node.
458 ///Processes the next node.
460 ///\return The processed node.
462 ///\warning The queue must not be empty!
463 Node processNextNode()
465 if(_queue_tail==_queue_next_dist) {
467 _queue_next_dist=_queue_head;
469 Node n=_queue[_queue_tail++];
470 _processed->set(n,true);
472 for(OutEdgeIt e(*G,n);e!=INVALID;++e)
473 if(!(*_reached)[m=G->target(e)]) {
474 _queue[_queue_head++]=m;
475 _reached->set(m,true);
477 _dist->set(m,_curr_dist);
482 ///Processes the next node.
484 ///Processes the next node. And checks that the given target node
485 ///is reached. If the target node is reachable from the processed
486 ///node then the reached parameter will be set true. The reached
487 ///parameter should be initially false.
489 ///\param target The target node.
490 ///\retval reached Indicates that the target node is reached.
491 ///\return The processed node.
493 ///\warning The queue must not be empty!
494 Node processNextNode(Node target, bool& reached)
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(OutEdgeIt 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 reached = reached || (target == m);
514 ///Processes the next node.
516 ///Processes the next node. And checks that at least one of
517 ///reached node has true value in the \c nm nodemap. If one node
518 ///with true value is reachable from the processed node then the
519 ///reached parameter will be set true. The reached parameter
520 ///should be initially false.
522 ///\param target The nodemaps of possible targets.
523 ///\retval reached Indicates that one of the target nodes is reached.
524 ///\return The processed node.
526 ///\warning The queue must not be empty!
528 Node processNextNode(const NM& nm, bool& reached)
530 if(_queue_tail==_queue_next_dist) {
532 _queue_next_dist=_queue_head;
534 Node n=_queue[_queue_tail++];
535 _processed->set(n,true);
537 for(OutEdgeIt e(*G,n);e!=INVALID;++e)
538 if(!(*_reached)[m=G->target(e)]) {
539 _queue[_queue_head++]=m;
540 _reached->set(m,true);
542 _dist->set(m,_curr_dist);
543 reached = reached || nm[m];
548 ///Next node to be processed.
550 ///Next node to be processed.
552 ///\return The next node to be processed or INVALID if the queue is
556 return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
559 ///\brief Returns \c false if there are nodes
560 ///to be processed in the queue
562 ///Returns \c false if there are nodes
563 ///to be processed in the queue
564 bool emptyQueue() { 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 in the queue.
569 int queueSize() { return _queue_head-_queue_tail; }
571 ///Executes the algorithm.
573 ///Executes the algorithm.
575 ///\pre init() must be called and at least one node should be added
576 ///with addSource() before using this function.
578 ///This method runs the %BFS algorithm from the root node(s)
581 ///shortest path to each node. The algorithm computes
582 ///- The shortest path tree.
583 ///- The distance of each node from the root(s).
587 while ( !emptyQueue() ) processNextNode();
590 ///Executes the algorithm until \c dest is reached.
592 ///Executes the algorithm until \c dest is reached.
594 ///\pre init() must be called and at least one node should be added
595 ///with addSource() before using this function.
597 ///This method runs the %BFS algorithm from the root node(s)
600 ///shortest path to \c dest. The algorithm computes
601 ///- The shortest path to \c dest.
602 ///- The distance of \c dest from the root(s).
604 void start(Node dest)
606 bool reached = false;
607 while ( !emptyQueue() && !reached) processNextNode(dest, reached);
610 ///Executes the algorithm until a condition is met.
612 ///Executes the algorithm until a condition is met.
614 ///\pre init() must be called and at least one node should be added
615 ///with addSource() before using this function.
617 ///\param nm must be a bool (or convertible) node map. The algorithm
618 ///will stop when it reaches a node \c v with <tt>nm[v]==true</tt>.
619 ///\todo query the reached target
621 void start(const NM &nm)
623 bool reached = false;
624 while ( !emptyQueue() && !reached) processNextNode(nm, reached);
627 ///Runs %BFS algorithm from node \c s.
629 ///This method runs the %BFS algorithm from a root node \c s
632 ///shortest path to each node. The algorithm computes
633 ///- The shortest path tree.
634 ///- The distance of each node from the root.
636 ///\note d.run(s) is just a shortcut of the following code.
648 ///Finds the shortest path between \c s and \c t.
650 ///Finds the shortest path between \c s and \c t.
652 ///\return The length of the shortest s---t path if there exists one,
654 ///\note Apart from the return value, d.run(s) is
655 ///just a shortcut of the following code.
661 int run(Node s,Node t) {
665 return reached(t)? _curr_dist : 0;
670 ///\name Query Functions
671 ///The result of the %BFS algorithm can be obtained using these
673 ///Before the use of these functions,
674 ///either run() or start() must be called.
678 ///Copies the shortest path to \c t into \c p
680 ///This function copies the shortest path to \c t into \c p.
681 ///If \c t is a source itself or unreachable, then it does not
683 ///\return Returns \c true if a path to \c t was actually copied to \c p,
684 ///\c false otherwise.
687 bool getPath(P &p,Node t)
691 typename P::Builder b(p);
692 for(b.setStartNode(t);predEdge(t)!=INVALID;t=predNode(t))
693 b.pushFront(predEdge(t));
700 ///The distance of a node from the root(s).
702 ///Returns the distance of a node from the root(s).
703 ///\pre \ref run() must be called before using this function.
704 ///\warning If node \c v in unreachable from the root(s) the return value
705 ///of this function is undefined.
706 int dist(Node v) const { return (*_dist)[v]; }
708 ///Returns the 'previous edge' of the shortest path tree.
710 ///For a node \c v it returns the 'previous edge'
711 ///of the shortest path tree,
712 ///i.e. it returns the last edge of a shortest path from the root(s) to \c
713 ///v. It is \ref INVALID
714 ///if \c v is unreachable from the root(s) or \c v is a root. The
715 ///shortest path tree used here is equal to the shortest path tree used in
717 ///\pre Either \ref run() or \ref start() must be called before using
719 Edge predEdge(Node v) const { return (*_pred)[v];}
721 ///Returns the 'previous node' of the shortest path tree.
723 ///For a node \c v it returns the 'previous node'
724 ///of the shortest path tree,
725 ///i.e. it returns the last but one node from a shortest path from the
727 ///It is INVALID if \c v is unreachable from the root(s) or
728 ///if \c v itself a root.
729 ///The shortest path tree used here is equal to the shortest path
730 ///tree used in \ref predEdge().
731 ///\pre Either \ref run() or \ref start() must be called before
732 ///using this function.
733 Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
734 G->source((*_pred)[v]); }
736 ///Returns a reference to the NodeMap of distances.
738 ///Returns a reference to the NodeMap of distances.
739 ///\pre Either \ref run() or \ref init() must
740 ///be called before using this function.
741 const DistMap &distMap() const { return *_dist;}
743 ///Returns a reference to the shortest path tree map.
745 ///Returns a reference to the NodeMap of the edges of the
746 ///shortest path tree.
747 ///\pre Either \ref run() or \ref init()
748 ///must be called before using this function.
749 const PredMap &predMap() const { return *_pred;}
751 ///Checks if a node is reachable from the root.
753 ///Returns \c true if \c v is reachable from the root.
754 ///\warning The source nodes are indicated as unreached.
755 ///\pre Either \ref run() or \ref start()
756 ///must be called before using this function.
758 bool reached(Node v) { return (*_reached)[v]; }
763 ///Default traits class of Bfs function.
765 ///Default traits class of Bfs function.
766 ///\param GR Graph type.
768 struct BfsWizardDefaultTraits
770 ///The graph type the algorithm runs on.
772 ///\brief The type of the map that stores the last
773 ///edges of the shortest paths.
775 ///The type of the map that stores the last
776 ///edges of the shortest paths.
777 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
779 typedef NullMap<typename Graph::Node,typename GR::Edge> PredMap;
780 ///Instantiates a PredMap.
782 ///This function instantiates a \ref PredMap.
783 ///\param g is the graph, to which we would like to define the PredMap.
784 ///\todo The graph alone may be insufficient to initialize
786 static PredMap *createPredMap(const GR &g)
788 static PredMap *createPredMap(const GR &)
791 return new PredMap();
794 ///The type of the map that indicates which nodes are processed.
796 ///The type of the map that indicates which nodes are processed.
797 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
798 ///\todo named parameter to set this type, function to read and write.
799 typedef NullMap<typename Graph::Node,bool> ProcessedMap;
800 ///Instantiates a ProcessedMap.
802 ///This function instantiates a \ref ProcessedMap.
803 ///\param g is the graph, to which
804 ///we would like to define the \ref ProcessedMap
806 static ProcessedMap *createProcessedMap(const GR &g)
808 static ProcessedMap *createProcessedMap(const GR &)
811 return new ProcessedMap();
813 ///The type of the map that indicates which nodes are reached.
815 ///The type of the map that indicates which nodes are reached.
816 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
817 ///\todo named parameter to set this type, function to read and write.
818 typedef typename Graph::template NodeMap<bool> ReachedMap;
819 ///Instantiates a ReachedMap.
821 ///This function instantiates a \ref ReachedMap.
822 ///\param G is the graph, to which
823 ///we would like to define the \ref ReachedMap.
824 static ReachedMap *createReachedMap(const GR &G)
826 return new ReachedMap(G);
828 ///The type of the map that stores the dists of the nodes.
830 ///The type of the map that stores the dists of the nodes.
831 ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
833 typedef NullMap<typename Graph::Node,int> DistMap;
834 ///Instantiates a DistMap.
836 ///This function instantiates a \ref DistMap.
837 ///\param g is the graph, to which we would like to define the \ref DistMap
839 static DistMap *createDistMap(const GR &g)
841 static DistMap *createDistMap(const GR &)
844 return new DistMap();
848 /// Default traits used by \ref BfsWizard
850 /// To make it easier to use Bfs algorithm
851 ///we have created a wizard class.
852 /// This \ref BfsWizard class needs default traits,
853 ///as well as the \ref Bfs class.
854 /// The \ref BfsWizardBase is a class to be the default traits of the
855 /// \ref BfsWizard class.
857 class BfsWizardBase : public BfsWizardDefaultTraits<GR>
860 typedef BfsWizardDefaultTraits<GR> Base;
862 /// Type of the nodes in the graph.
863 typedef typename Base::Graph::Node Node;
865 /// Pointer to the underlying graph.
867 ///Pointer to the map of reached nodes.
869 ///Pointer to the map of processed nodes.
871 ///Pointer to the map of predecessors edges.
873 ///Pointer to the map of distances.
875 ///Pointer to the source node.
881 /// This constructor does not require parameters, therefore it initiates
882 /// all of the attributes to default values (0, INVALID).
883 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
884 _dist(0), _source(INVALID) {}
888 /// This constructor requires some parameters,
889 /// listed in the parameters list.
890 /// Others are initiated to 0.
891 /// \param g is the initial value of \ref _g
892 /// \param s is the initial value of \ref _source
893 BfsWizardBase(const GR &g, Node s=INVALID) :
894 _g((void *)&g), _reached(0), _processed(0), _pred(0),
895 _dist(0), _source(s) {}
899 /// A class to make the usage of Bfs algorithm easier
901 /// This class is created to make it easier to use Bfs algorithm.
902 /// It uses the functions and features of the plain \ref Bfs,
903 /// but it is much simpler to use it.
905 /// Simplicity means that the way to change the types defined
906 /// in the traits class is based on functions that returns the new class
907 /// and not on templatable built-in classes.
908 /// When using the plain \ref Bfs
909 /// the new class with the modified type comes from
910 /// the original class by using the ::
911 /// operator. In the case of \ref BfsWizard only
912 /// a function have to be called and it will
913 /// return the needed class.
915 /// It does not have own \ref run method. When its \ref run method is called
916 /// it initiates a plain \ref Bfs class, and calls the \ref Bfs::run
919 class BfsWizard : public TR
923 ///The type of the underlying graph.
924 typedef typename TR::Graph Graph;
926 typedef typename Graph::Node Node;
928 typedef typename Graph::NodeIt NodeIt;
930 typedef typename Graph::Edge Edge;
932 typedef typename Graph::OutEdgeIt OutEdgeIt;
934 ///\brief The type of the map that stores
936 typedef typename TR::ReachedMap ReachedMap;
937 ///\brief The type of the map that stores
938 ///the processed nodes
939 typedef typename TR::ProcessedMap ProcessedMap;
940 ///\brief The type of the map that stores the last
941 ///edges of the shortest paths.
942 typedef typename TR::PredMap PredMap;
943 ///The type of the map that stores the dists of the nodes.
944 typedef typename TR::DistMap DistMap;
948 BfsWizard() : TR() {}
950 /// Constructor that requires parameters.
952 /// Constructor that requires parameters.
953 /// These parameters will be the default values for the traits class.
954 BfsWizard(const Graph &g, Node s=INVALID) :
958 BfsWizard(const TR &b) : TR(b) {}
962 ///Runs Bfs algorithm from a given node.
964 ///Runs Bfs algorithm from a given node.
965 ///The node can be given by the \ref source function.
968 if(Base::_source==INVALID) throw UninitializedParameter();
969 Bfs<Graph,TR> alg(*(Graph*)Base::_g);
971 alg.reachedMap(*(ReachedMap*)Base::_reached);
972 if(Base::_processed) alg.processedMap(*(ProcessedMap*)Base::_processed);
973 if(Base::_pred) alg.predMap(*(PredMap*)Base::_pred);
974 if(Base::_dist) alg.distMap(*(DistMap*)Base::_dist);
975 alg.run(Base::_source);
978 ///Runs Bfs algorithm from the given node.
980 ///Runs Bfs algorithm from the given node.
981 ///\param s is the given source.
989 struct DefPredMapBase : public Base {
991 static PredMap *createPredMap(const Graph &) { return 0; };
992 DefPredMapBase(const TR &b) : TR(b) {}
995 ///\brief \ref named-templ-param "Named parameter"
996 ///function for setting PredMap
998 /// \ref named-templ-param "Named parameter"
999 ///function for setting PredMap
1002 BfsWizard<DefPredMapBase<T> > predMap(const T &t)
1004 Base::_pred=(void *)&t;
1005 return BfsWizard<DefPredMapBase<T> >(*this);
1010 struct DefReachedMapBase : public Base {
1011 typedef T ReachedMap;
1012 static ReachedMap *createReachedMap(const Graph &) { return 0; };
1013 DefReachedMapBase(const TR &b) : TR(b) {}
1016 ///\brief \ref named-templ-param "Named parameter"
1017 ///function for setting ReachedMap
1019 /// \ref named-templ-param "Named parameter"
1020 ///function for setting ReachedMap
1023 BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t)
1025 Base::_pred=(void *)&t;
1026 return BfsWizard<DefReachedMapBase<T> >(*this);
1031 struct DefProcessedMapBase : public Base {
1032 typedef T ProcessedMap;
1033 static ProcessedMap *createProcessedMap(const Graph &) { return 0; };
1034 DefProcessedMapBase(const TR &b) : TR(b) {}
1037 ///\brief \ref named-templ-param "Named parameter"
1038 ///function for setting ProcessedMap
1040 /// \ref named-templ-param "Named parameter"
1041 ///function for setting ProcessedMap
1044 BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t)
1046 Base::_pred=(void *)&t;
1047 return BfsWizard<DefProcessedMapBase<T> >(*this);
1052 struct DefDistMapBase : public Base {
1054 static DistMap *createDistMap(const Graph &) { return 0; };
1055 DefDistMapBase(const TR &b) : TR(b) {}
1058 ///\brief \ref named-templ-param "Named parameter"
1059 ///function for setting DistMap type
1061 /// \ref named-templ-param "Named parameter"
1062 ///function for setting DistMap type
1065 BfsWizard<DefDistMapBase<T> > distMap(const T &t)
1067 Base::_dist=(void *)&t;
1068 return BfsWizard<DefDistMapBase<T> >(*this);
1071 /// Sets the source node, from which the Bfs algorithm runs.
1073 /// Sets the source node, from which the Bfs algorithm runs.
1074 /// \param s is the source node.
1075 BfsWizard<TR> &source(Node s)
1083 ///Function type interface for Bfs algorithm.
1085 /// \ingroup flowalgs
1086 ///Function type interface for Bfs algorithm.
1088 ///This function also has several
1089 ///\ref named-templ-func-param "named parameters",
1090 ///they are declared as the members of class \ref BfsWizard.
1092 ///example shows how to use these parameters.
1094 /// bfs(g,source).predMap(preds).run();
1096 ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
1097 ///to the end of the parameter list.
1101 BfsWizard<BfsWizardBase<GR> >
1102 bfs(const GR &g,typename GR::Node s=INVALID)
1104 return BfsWizard<BfsWizardBase<GR> >(g,s);
1107 } //END OF NAMESPACE LEMON