/* -*- mode: C++; indent-tabs-mode: nil; -*-
* This file is a part of LEMON, a generic C++ optimization library.
* Copyright (C) 2003-2008
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
* (Egervary Research Group on Combinatorial Optimization, EGRES).
* Permission to use, modify and distribute this software is granted
* provided that this copyright notice appears in all copies. For
* precise terms see the accompanying LICENSE file.
* This software is provided "AS IS" with no warranty of any kind,
* express or implied, and with no claim as to its suitability for any
#include <lemon/list_graph.h>
#include <lemon/bits/path_dump.h>
///Default traits class of Bfs class.
///Default traits class of Bfs class.
///\tparam GR Digraph type.
///The type of the digraph the algorithm runs on.
///\brief The type of the map that stores the predecessor
///arcs of the shortest paths.
///The type of the map that stores the predecessor
///arcs of the shortest paths.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
///Instantiates a \ref PredMap.
///This function instantiates a \ref PredMap.
///\param g is the digraph, to which we would like to define the
///\todo The digraph alone may be insufficient to initialize
static PredMap *createPredMap(const Digraph &g)
///The type of the map that indicates which nodes are processed.
///The type of the map that indicates which nodes are processed.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
///By default it is a NullMap.
typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
///Instantiates a \ref ProcessedMap.
///This function instantiates a \ref ProcessedMap.
///\param g is the digraph, to which
///we would like to define the \ref ProcessedMap
static ProcessedMap *createProcessedMap(const Digraph &g)
static ProcessedMap *createProcessedMap(const Digraph &)
return new ProcessedMap();
///The type of the map that indicates which nodes are reached.
///The type of the map that indicates which nodes are reached.
///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
typedef typename Digraph::template NodeMap<bool> ReachedMap;
///Instantiates a \ref ReachedMap.
///This function instantiates a \ref ReachedMap.
///\param g is the digraph, to which
///we would like to define the \ref ReachedMap.
static ReachedMap *createReachedMap(const Digraph &g)
return new ReachedMap(g);
///The type of the map that stores the distances of the nodes.
///The type of the map that stores the distances of the nodes.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef typename Digraph::template NodeMap<int> DistMap;
///Instantiates a \ref DistMap.
///This function instantiates a \ref DistMap.
///\param g is the digraph, to which we would like to define the
static DistMap *createDistMap(const Digraph &g)
///This class provides an efficient implementation of the %BFS algorithm.
///There is also a \ref bfs() "function type interface" for the BFS
///algorithm, which is convenient in the simplier cases and it can be
///\tparam GR The type of the digraph the algorithm runs on.
///The default value is \ref ListDigraph. The value of GR is not used
///directly by \ref Bfs, it is only passed to \ref BfsDefaultTraits.
///\tparam TR Traits class to set various data types used by the algorithm.
///The default traits class is
///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
///See \ref BfsDefaultTraits for the documentation of
template <typename GR=ListDigraph,
typename TR=BfsDefaultTraits<GR> >
///\ref Exception for uninitialized parameters.
///This error represents problems in the initialization of the
///parameters of the algorithm.
class UninitializedParameter : public lemon::UninitializedParameter {
virtual const char* what() const throw() {
return "lemon::Bfs::UninitializedParameter";
///The type of the digraph the algorithm runs on.
typedef typename TR::Digraph Digraph;
///\brief The type of the map that stores the predecessor arcs of the
typedef typename TR::PredMap PredMap;
///The type of the map that stores the distances of the nodes.
typedef typename TR::DistMap DistMap;
///The type of the map that indicates which nodes are reached.
typedef typename TR::ReachedMap ReachedMap;
///The type of the map that indicates which nodes are processed.
typedef typename TR::ProcessedMap ProcessedMap;
///The type of the paths.
typedef PredMapPath<Digraph, PredMap> Path;
typedef typename Digraph::Node Node;
typedef typename Digraph::NodeIt NodeIt;
typedef typename Digraph::Arc Arc;
typedef typename Digraph::OutArcIt OutArcIt;
//Pointer to the underlying digraph.
//Pointer to the map of predecessor arcs.
//Indicates if _pred is locally allocated (true) or not.
//Pointer to the map of distances.
//Indicates if _dist is locally allocated (true) or not.
//Pointer to the map of reached status of the nodes.
//Indicates if _reached is locally allocated (true) or not.
//Pointer to the map of processed status of the nodes.
ProcessedMap *_processed;
//Indicates if _processed is locally allocated (true) or not.
std::vector<typename Digraph::Node> _queue;
int _queue_head,_queue_tail,_queue_next_dist;
///Creates the maps if necessary.
///\todo Better memory allocation (instead of new).
_pred = Traits::createPredMap(*G);
_dist = Traits::createDistMap(*G);
_reached = Traits::createReachedMap(*G);
_processed = Traits::createProcessedMap(*G);
///\name Named template parameters
struct DefPredMapTraits : public Traits {
static PredMap *createPredMap(const Digraph &)
throw UninitializedParameter();
///\brief \ref named-templ-param "Named parameter" for setting
///\ref named-templ-param "Named parameter" for setting
struct DefPredMap : public Bfs< Digraph, DefPredMapTraits<T> > {
typedef Bfs< Digraph, DefPredMapTraits<T> > Create;
struct DefDistMapTraits : public Traits {
static DistMap *createDistMap(const Digraph &)
throw UninitializedParameter();
///\brief \ref named-templ-param "Named parameter" for setting
///\ref named-templ-param "Named parameter" for setting
struct DefDistMap : public Bfs< Digraph, DefDistMapTraits<T> > {
typedef Bfs< Digraph, DefDistMapTraits<T> > Create;
struct DefReachedMapTraits : public Traits {
static ReachedMap *createReachedMap(const Digraph &)
throw UninitializedParameter();
///\brief \ref named-templ-param "Named parameter" for setting
///\ref named-templ-param "Named parameter" for setting
struct DefReachedMap : public Bfs< Digraph, DefReachedMapTraits<T> > {
typedef Bfs< Digraph, DefReachedMapTraits<T> > Create;
struct DefProcessedMapTraits : public Traits {
static ProcessedMap *createProcessedMap(const Digraph &)
throw UninitializedParameter();
///\brief \ref named-templ-param "Named parameter" for setting
///\ref ProcessedMap type.
///\ref named-templ-param "Named parameter" for setting
///\ref ProcessedMap type.
struct DefProcessedMap : public Bfs< Digraph, DefProcessedMapTraits<T> > {
typedef Bfs< Digraph, DefProcessedMapTraits<T> > Create;
struct DefDigraphProcessedMapTraits : public Traits {
typedef typename Digraph::template NodeMap<bool> ProcessedMap;
static ProcessedMap *createProcessedMap(const Digraph &g)
return new ProcessedMap(g);
///\brief \ref named-templ-param "Named parameter" for setting
///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
///\ref named-templ-param "Named parameter" for setting
///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
///If you don't set it explicitly, it will be automatically allocated.
struct DefProcessedMapToBeDefaultMap :
public Bfs< Digraph, DefDigraphProcessedMapTraits> {
typedef Bfs< Digraph, DefDigraphProcessedMapTraits> Create;
///\param g The digraph the algorithm runs on.
_pred(NULL), local_pred(false),
_dist(NULL), local_dist(false),
_reached(NULL), local_reached(false),
_processed(NULL), local_processed(false)
if(local_pred) delete _pred;
if(local_dist) delete _dist;
if(local_reached) delete _reached;
if(local_processed) delete _processed;
///Sets the map that stores the predecessor arcs.
///Sets the map that stores the predecessor arcs.
///If you don't use this function before calling \ref run(),
///it will allocate one. The destructor deallocates this
///automatically allocated map, of course.
///\return <tt> (*this) </tt>
///Sets the map that indicates which nodes are reached.
///Sets the map that indicates which nodes are reached.
///If you don't use this function before calling \ref run(),
///it will allocate one. The destructor deallocates this
///automatically allocated map, of course.
///\return <tt> (*this) </tt>
Bfs &reachedMap(ReachedMap &m)
///Sets the map that indicates which nodes are processed.
///Sets the map that indicates which nodes are processed.
///If you don't use this function before calling \ref run(),
///it will allocate one. The destructor deallocates this
///automatically allocated map, of course.
///\return <tt> (*this) </tt>
Bfs &processedMap(ProcessedMap &m)
///Sets the map that stores the distances of the nodes.
///Sets the map that stores the distances of the nodes calculated by
///If you don't use this function before calling \ref run(),
///it will allocate one. The destructor deallocates this
///automatically allocated map, of course.
///\return <tt> (*this) </tt>
///\name Execution control
///The simplest way to execute the algorithm is to use
///one of the member functions called \ref lemon::Bfs::run() "run()".
///If you need more control on the execution, first you must call
///\ref lemon::Bfs::init() "init()", then you can add several source
///nodes with \ref lemon::Bfs::addSource() "addSource()".
///Finally \ref lemon::Bfs::start() "start()" will perform the
///actual path computation.
///Initializes the internal data structures.
///Initializes the internal data structures.
_queue.resize(countNodes(*G));
_queue_head=_queue_tail=0;
for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
_processed->set(u,false);
///Adds a new source node.
///Adds a new source node to the set of nodes to be processed.
_queue_next_dist=_queue_head;
///Processes the next node.
///Processes the next node.
///\return The processed node.
///\pre The queue must not be empty.
if(_queue_tail==_queue_next_dist) {
_queue_next_dist=_queue_head;
Node n=_queue[_queue_tail++];
for(OutArcIt e(*G,n);e!=INVALID;++e)
if(!(*_reached)[m=G->target(e)]) {
_dist->set(m,_curr_dist);
///Processes the next node.
///Processes the next node and checks if the given target node
///is reached. If the target node is reachable from the processed
///node, then the \c reach parameter will be set to \c true.
///\param target The target node.
///\retval reach Indicates if the target node is reached.
///It should be initially \c false.
///\return The processed node.
///\pre The queue must not be empty.
Node processNextNode(Node target, bool& reach)
if(_queue_tail==_queue_next_dist) {
_queue_next_dist=_queue_head;
Node n=_queue[_queue_tail++];
for(OutArcIt e(*G,n);e!=INVALID;++e)
if(!(*_reached)[m=G->target(e)]) {
_dist->set(m,_curr_dist);
reach = reach || (target == m);
///Processes the next node.
///Processes the next node and checks if at least one of reached
///nodes has \c true value in the \c nm node map. If one node
///with \c true value is reachable from the processed node, then the
///\c rnode parameter will be set to the first of such nodes.
///\param nm A \c bool (or convertible) node map that indicates the
///\retval rnode The reached target node.
///It should be initially \c INVALID.
///\return The processed node.
///\pre The queue must not be empty.
Node processNextNode(const NM& nm, Node& rnode)
if(_queue_tail==_queue_next_dist) {
_queue_next_dist=_queue_head;
Node n=_queue[_queue_tail++];
for(OutArcIt e(*G,n);e!=INVALID;++e)
if(!(*_reached)[m=G->target(e)]) {
_dist->set(m,_curr_dist);
if (nm[m] && rnode == INVALID) rnode = m;
///The next node to be processed.
///Returns the next node to be processed or \c INVALID if the queue
return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
///\brief Returns \c false if there are nodes
///Returns \c false if there are nodes
///to be processed in the queue.
bool emptyQueue() const { return _queue_tail==_queue_head; }
///Returns the number of the nodes to be processed.
///Returns the number of the nodes to be processed in the queue.
int queueSize() const { return _queue_head-_queue_tail; }
///Executes the algorithm.
///Executes the algorithm.
///This method runs the %BFS algorithm from the root node(s)
///in order to compute the shortest path to each node.
///The algorithm computes
///- the shortest path tree (forest),
///- the distance of each node from the root(s).
///\pre init() must be called and at least one root node should be
///added with addSource() before using this function.
///\note <tt>b.start()</tt> is just a shortcut of the following code.
/// while ( !b.emptyQueue() ) {
while ( !emptyQueue() ) processNextNode();
///Executes the algorithm until the given target node is reached.
///Executes the algorithm until the given target node is reached.
///This method runs the %BFS algorithm from the root node(s)
///in order to compute the shortest path to \c dest.
///The algorithm computes
///- the shortest path to \c dest,
///- the distance of \c dest from the root(s).
///\pre init() must be called and at least one root node should be
///added with addSource() before using this function.
///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
/// while ( !b.emptyQueue() && !reach ) {
/// b.processNextNode(t, reach);
while ( !emptyQueue() && !reach ) processNextNode(dest, reach);
///Executes the algorithm until a condition is met.
///Executes the algorithm until a condition is met.
///This method runs the %BFS algorithm from the root node(s) in
///order to compute the shortest path to a node \c v with
/// <tt>nm[v]</tt> true, if such a node can be found.
///\param nm A \c bool (or convertible) node map. The algorithm
///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
///\return The reached node \c v with <tt>nm[v]</tt> true or
///\c INVALID if no such node was found.
///\pre init() must be called and at least one root node should be
///added with addSource() before using this function.
///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
/// Node rnode = INVALID;
/// while ( !b.emptyQueue() && rnode == INVALID ) {
/// b.processNextNode(nm, rnode);
template<class NodeBoolMap>
Node start(const NodeBoolMap &nm)
while ( !emptyQueue() && rnode == INVALID ) {
processNextNode(nm, rnode);
///Runs the algorithm from the given node.
///This method runs the %BFS algorithm from node \c s
///in order to compute the shortest path to each node.
///The algorithm computes
///- the shortest path tree,
///- the distance of each node from the root.
///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
///Finds the shortest path between \c s and \c t.
///This method runs the %BFS algorithm from node \c s
///in order to compute the shortest path to \c t.
///\return The length of the shortest <tt>s</tt>--<tt>t</tt> path,
///if \c t is reachable form \c s, \c 0 otherwise.
///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
///shortcut of the following code.
return reached(t) ? _curr_dist : 0;
///Runs the algorithm to visit all nodes in the digraph.
///This method runs the %BFS algorithm in order to
///compute the shortest path to each node.
///The algorithm computes
///- the shortest path tree (forest),
///- the distance of each node from the root(s).
///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
/// for (NodeIt n(gr); n != INVALID; ++n) {
for (NodeIt n(*G); n != INVALID; ++n) {
///The result of the %BFS algorithm can be obtained using these
///Either \ref lemon::Bfs::run() "run()" or \ref lemon::Bfs::start()
///"start()" must be called before using them.
///The shortest path to a node.
///Returns the shortest path to a node.
///\warning \c t should be reachable from the root(s).
///\pre Either \ref run() or \ref start() must be called before
Path path(Node t) const { return Path(*G, *_pred, t); }
///The distance of a node from the root(s).
///Returns the distance of a node from the root(s).
///\warning If node \c v is not reachable from the root(s), then
///the return value of this function is undefined.
///\pre Either \ref run() or \ref start() must be called before
int dist(Node v) const { return (*_dist)[v]; }
///Returns the 'previous arc' of the shortest path tree for a node.
///This function returns the 'previous arc' of the shortest path
///tree for the node \c v, i.e. it returns the last arc of a
///shortest path from the root(s) to \c v. It is \c INVALID if \c v
///is not reachable from the root(s) or if \c v is a root.
///The shortest path tree used here is equal to the shortest path
///tree used in \ref predNode().
///\pre Either \ref run() or \ref start() must be called before
Arc predArc(Node v) const { return (*_pred)[v];}
///Returns the 'previous node' of the shortest path tree for a node.
///This function returns the 'previous node' of the shortest path
///tree for the node \c v, i.e. it returns the last but one node
///from a shortest path from the root(s) to \c v. It is \c INVALID
///if \c v is not reachable from the root(s) or if \c v is a root.
///The shortest path tree used here is equal to the shortest path
///tree used in \ref predArc().
///\pre Either \ref run() or \ref start() must be called before
Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
G->source((*_pred)[v]); }
///\brief Returns a const reference to the node map that stores the
/// distances of the nodes.
///Returns a const reference to the node map that stores the distances
///of the nodes calculated by the algorithm.
///\pre Either \ref run() or \ref init()
///must be called before using this function.
const DistMap &distMap() const { return *_dist;}
///\brief Returns a const reference to the node map that stores the
///Returns a const reference to the node map that stores the predecessor
///arcs, which form the shortest path tree.
///\pre Either \ref run() or \ref init()
///must be called before using this function.
const PredMap &predMap() const { return *_pred;}
///Checks if a node is reachable from the root(s).
///Returns \c true if \c v is reachable from the root(s).
///\pre Either \ref run() or \ref start()
///must be called before using this function.
bool reached(Node v) const { return (*_reached)[v]; }
///Default traits class of bfs() function.
///Default traits class of bfs() function.
///\tparam GR Digraph type.
struct BfsWizardDefaultTraits
///The type of the digraph the algorithm runs on.
///\brief The type of the map that stores the predecessor
///arcs of the shortest paths.
///The type of the map that stores the predecessor
///arcs of the shortest paths.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef NullMap<typename Digraph::Node,typename Digraph::Arc> PredMap;
///Instantiates a \ref PredMap.
///This function instantiates a \ref PredMap.
///\param g is the digraph, to which we would like to define the
///\todo The digraph alone may be insufficient to initialize
static PredMap *createPredMap(const Digraph &g)
static PredMap *createPredMap(const Digraph &)
///The type of the map that indicates which nodes are processed.
///The type of the map that indicates which nodes are processed.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
///Instantiates a \ref ProcessedMap.
///This function instantiates a \ref ProcessedMap.
///\param g is the digraph, to which
///we would like to define the \ref ProcessedMap.
static ProcessedMap *createProcessedMap(const Digraph &g)
static ProcessedMap *createProcessedMap(const Digraph &)
return new ProcessedMap();
///The type of the map that indicates which nodes are reached.
///The type of the map that indicates which nodes are reached.
///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
typedef typename Digraph::template NodeMap<bool> ReachedMap;
///Instantiates a \ref ReachedMap.
///This function instantiates a \ref ReachedMap.
///\param g is the digraph, to which
///we would like to define the \ref ReachedMap.
static ReachedMap *createReachedMap(const Digraph &g)
return new ReachedMap(g);
///The type of the map that stores the distances of the nodes.
///The type of the map that stores the distances of the nodes.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef NullMap<typename Digraph::Node,int> DistMap;
///Instantiates a \ref DistMap.
///This function instantiates a \ref DistMap.
///\param g is the digraph, to which we would like to define
static DistMap *createDistMap(const Digraph &g)
static DistMap *createDistMap(const Digraph &)
/// Default traits class used by \ref BfsWizard
/// To make it easier to use Bfs algorithm
/// we have created a wizard class.
/// This \ref BfsWizard class needs default traits,
/// as well as the \ref Bfs class.
/// The \ref BfsWizardBase is a class to be the default traits of the
/// \ref BfsWizard class.
class BfsWizardBase : public BfsWizardDefaultTraits<GR>
typedef BfsWizardDefaultTraits<GR> Base;
//The type of the nodes in the digraph.
typedef typename Base::Digraph::Node Node;
//Pointer to the digraph the algorithm runs on.
//Pointer to the map of reached nodes.
//Pointer to the map of processed nodes.
//Pointer to the map of predecessors arcs.
//Pointer to the map of distances.
//Pointer to the source node.
/// This constructor does not require parameters, therefore it initiates
/// all of the attributes to default values (0, INVALID).
BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
_dist(0), _source(INVALID) {}
/// This constructor requires some parameters,
/// listed in the parameters list.
/// Others are initiated to 0.
/// \param g The digraph the algorithm runs on.
/// \param s The source node.
BfsWizardBase(const GR &g, Node s=INVALID) :
_g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
_reached(0), _processed(0), _pred(0), _dist(0), _source(s) {}
/// Auxiliary class for the function type interface of BFS algorithm.
/// This auxiliary class is created to implement the function type
/// interface of \ref Bfs algorithm. It uses the functions and features
/// of the plain \ref Bfs, but it is much simpler to use it.
/// It should only be used through the \ref bfs() function, which makes
/// it easier to use the algorithm.
/// Simplicity means that the way to change the types defined
/// in the traits class is based on functions that returns the new class
/// and not on templatable built-in classes.
/// When using the plain \ref Bfs
/// the new class with the modified type comes from
/// the original class by using the ::
/// operator. In the case of \ref BfsWizard only
/// a function have to be called, and it will
/// return the needed class.
/// It does not have own \ref run() method. When its \ref run() method
/// is called, it initiates a plain \ref Bfs object, and calls the
/// \ref Bfs::run() method of it.
class BfsWizard : public TR
///The type of the digraph the algorithm runs on.
typedef typename TR::Digraph Digraph;
typedef typename Digraph::Node Node;
typedef typename Digraph::NodeIt NodeIt;
typedef typename Digraph::Arc Arc;
typedef typename Digraph::OutArcIt OutArcIt;
///\brief The type of the map that stores the predecessor
///arcs of the shortest paths.
typedef typename TR::PredMap PredMap;
///\brief The type of the map that stores the distances of the nodes.
typedef typename TR::DistMap DistMap;
///\brief The type of the map that indicates which nodes are reached.
typedef typename TR::ReachedMap ReachedMap;
///\brief The type of the map that indicates which nodes are processed.
typedef typename TR::ProcessedMap ProcessedMap;
/// Constructor that requires parameters.
/// Constructor that requires parameters.
/// These parameters will be the default values for the traits class.
BfsWizard(const Digraph &g, Node s=INVALID) :
BfsWizard(const TR &b) : TR(b) {}
///Runs BFS algorithm from a source node.
///Runs BFS algorithm from a source node.
///The node can be given with the \ref source() function.
if(Base::_source==INVALID) throw UninitializedParameter();
Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
///Runs BFS algorithm from the given node.
///Runs BFS algorithm from the given node.
///\param s is the given source.
/// Sets the source node, from which the Bfs algorithm runs.
/// Sets the source node, from which the Bfs algorithm runs.
/// \param s is the source node.
BfsWizard<TR> &source(Node s)
struct DefPredMapBase : public Base {
static PredMap *createPredMap(const Digraph &) { return 0; };
DefPredMapBase(const TR &b) : TR(b) {}
///\brief \ref named-templ-param "Named parameter"
///for setting \ref PredMap object.
/// \ref named-templ-param "Named parameter"
///for setting \ref PredMap object.
BfsWizard<DefPredMapBase<T> > predMap(const T &t)
Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
return BfsWizard<DefPredMapBase<T> >(*this);
struct DefReachedMapBase : public Base {
static ReachedMap *createReachedMap(const Digraph &) { return 0; };
DefReachedMapBase(const TR &b) : TR(b) {}
///\brief \ref named-templ-param "Named parameter"
///for setting \ref ReachedMap object.
/// \ref named-templ-param "Named parameter"
///for setting \ref ReachedMap object.
BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t)
Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
return BfsWizard<DefReachedMapBase<T> >(*this);
struct DefProcessedMapBase : public Base {
static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
DefProcessedMapBase(const TR &b) : TR(b) {}
///\brief \ref named-templ-param "Named parameter"
///for setting \ref ProcessedMap object.
/// \ref named-templ-param "Named parameter"
///for setting \ref ProcessedMap object.
BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t)
Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
return BfsWizard<DefProcessedMapBase<T> >(*this);
struct DefDistMapBase : public Base {
static DistMap *createDistMap(const Digraph &) { return 0; };
DefDistMapBase(const TR &b) : TR(b) {}
///\brief \ref named-templ-param "Named parameter"
///for setting \ref DistMap object.
/// \ref named-templ-param "Named parameter"
///for setting \ref DistMap object.
BfsWizard<DefDistMapBase<T> > distMap(const T &t)
Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
return BfsWizard<DefDistMapBase<T> >(*this);
///Function type interface for Bfs algorithm.
///Function type interface for Bfs algorithm.
///This function also has several
///\ref named-templ-func-param "named parameters",
///they are declared as the members of class \ref BfsWizard.
///example shows how to use these parameters.
/// bfs(g,source).predMap(preds).run();
///\warning Don't forget to put the \ref BfsWizard::run() "run()"
///to the end of the parameter list.
BfsWizard<BfsWizardBase<GR> >
bfs(const GR &g,typename GR::Node s=INVALID)
return BfsWizard<BfsWizardBase<GR> >(g,s);
/// \brief Visitor class for BFS.
/// This class defines the interface of the BfsVisit events, and
/// it could be the base of a real visitor class.
template <typename _Digraph>
typedef _Digraph Digraph;
typedef typename Digraph::Arc Arc;
typedef typename Digraph::Node Node;
/// \brief Called for the source node(s) of the BFS.
/// This function is called for the source node(s) of the BFS.
void start(const Node& node) {}
/// \brief Called when a node is reached first time.
/// This function is called when a node is reached first time.
void reach(const Node& node) {}
/// \brief Called when a node is processed.
/// This function is called when a node is processed.
void process(const Node& node) {}
/// \brief Called when an arc reaches a new node.
/// This function is called when the BFS finds an arc whose target node
void discover(const Arc& arc) {}
/// \brief Called when an arc is examined but its target node is
/// This function is called when an arc is examined but its target node is
void examine(const Arc& arc) {}
template <typename _Digraph>
typedef _Digraph Digraph;
typedef typename Digraph::Arc Arc;
typedef typename Digraph::Node Node;
void start(const Node&) {}
void reach(const Node&) {}
void process(const Node&) {}
void discover(const Arc&) {}
void examine(const Arc&) {}
template <typename _Visitor>
/// \brief Default traits class of BfsVisit class.
/// Default traits class of BfsVisit class.
/// \tparam _Digraph The type of the digraph the algorithm runs on.
struct BfsVisitDefaultTraits {
/// \brief The type of the digraph the algorithm runs on.
typedef _Digraph Digraph;
/// \brief The type of the map that indicates which nodes are reached.
/// The type of the map that indicates which nodes are reached.
/// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
typedef typename Digraph::template NodeMap<bool> ReachedMap;
/// \brief Instantiates a \ref ReachedMap.
/// This function instantiates a \ref ReachedMap.
/// \param digraph is the digraph, to which
/// we would like to define the \ref ReachedMap.
static ReachedMap *createReachedMap(const Digraph &digraph) {
return new ReachedMap(digraph);
/// \brief %BFS algorithm class with visitor interface.
/// This class provides an efficient implementation of the %BFS algorithm
/// with visitor interface.
/// The %BfsVisit class provides an alternative interface to the Bfs
/// class. It works with callback mechanism, the BfsVisit object calls
/// the member functions of the \c Visitor class on every BFS event.
/// \tparam _Digraph The type of the digraph the algorithm runs on.
/// \ref ListDigraph. The value of _Digraph is not used directly by
/// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
/// \tparam _Visitor The Visitor type that is used by the algorithm.
/// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
/// does not observe the BFS events. If you want to observe the BFS
/// events, you should implement your own visitor class.
/// \tparam _Traits Traits class to set various data types used by the
/// algorithm. The default traits class is
/// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
/// See \ref BfsVisitDefaultTraits for the documentation of
/// a BFS visit traits class.
template <typename _Digraph, typename _Visitor, typename _Traits>
template <typename _Digraph = ListDigraph,
typename _Visitor = BfsVisitor<_Digraph>,
typename _Traits = BfsDefaultTraits<_Digraph> >
/// \brief \ref Exception for uninitialized parameters.
/// This error represents problems in the initialization
/// of the parameters of the algorithm.
class UninitializedParameter : public lemon::UninitializedParameter {
virtual const char* what() const throw()
return "lemon::BfsVisit::UninitializedParameter";
///The type of the digraph the algorithm runs on.
typedef typename Traits::Digraph Digraph;
///The visitor type used by the algorithm.
typedef _Visitor Visitor;
///The type of the map that indicates which nodes are reached.
typedef typename Traits::ReachedMap ReachedMap;
typedef typename Digraph::Node Node;
typedef typename Digraph::NodeIt NodeIt;
typedef typename Digraph::Arc Arc;
typedef typename Digraph::OutArcIt OutArcIt;
//Pointer to the underlying digraph.
//Pointer to the visitor object.
//Pointer to the map of reached status of the nodes.
//Indicates if _reached is locally allocated (true) or not.
std::vector<typename Digraph::Node> _list;
int _list_front, _list_back;
///Creates the maps if necessary.
///\todo Better memory allocation (instead of new).
_reached = Traits::createReachedMap(*_digraph);
/// \name Named template parameters
struct DefReachedMapTraits : public Traits {
static ReachedMap *createReachedMap(const Digraph &digraph) {
throw UninitializedParameter();
/// \brief \ref named-templ-param "Named parameter" for setting
/// \ref named-templ-param "Named parameter" for setting ReachedMap type.
struct DefReachedMap : public BfsVisit< Digraph, Visitor,
DefReachedMapTraits<T> > {
typedef BfsVisit< Digraph, Visitor, DefReachedMapTraits<T> > Create;
/// \param digraph The digraph the algorithm runs on.
/// \param visitor The visitor object of the algorithm.
BfsVisit(const Digraph& digraph, Visitor& visitor)
: _digraph(&digraph), _visitor(&visitor),
_reached(0), local_reached(false) {}
if(local_reached) delete _reached;
/// \brief Sets the map that indicates which nodes are reached.
/// Sets the map that indicates which nodes are reached.
/// If you don't use this function before calling \ref run(),
/// it will allocate one. The destructor deallocates this
/// automatically allocated map, of course.
/// \return <tt> (*this) </tt>
BfsVisit &reachedMap(ReachedMap &m) {
/// \name Execution control
/// The simplest way to execute the algorithm is to use
/// one of the member functions called \ref lemon::BfsVisit::run()
/// If you need more control on the execution, first you must call
/// \ref lemon::BfsVisit::init() "init()", then you can add several
/// source nodes with \ref lemon::BfsVisit::addSource() "addSource()".
/// Finally \ref lemon::BfsVisit::start() "start()" will perform the
/// actual path computation.
/// \brief Initializes the internal data structures.
/// Initializes the internal data structures.
_list.resize(countNodes(*_digraph));
_list_front = _list_back = -1;
for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
/// \brief Adds a new source node.
/// Adds a new source node to the set of nodes to be processed.
/// \brief Processes the next node.
/// Processes the next node.
/// \return The processed node.
/// \pre The queue must not be empty.
Node n = _list[++_list_front];
for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
Node m = _digraph->target(e);
/// \brief Processes the next node.
/// Processes the next node and checks if the given target node
/// is reached. If the target node is reachable from the processed
/// node, then the \c reach parameter will be set to \c true.
/// \param target The target node.
/// \retval reach Indicates if the target node is reached.
/// It should be initially \c false.
/// \return The processed node.
/// \pre The queue must not be empty.
Node processNextNode(Node target, bool& reach) {
Node n = _list[++_list_front];
for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
Node m = _digraph->target(e);
reach = reach || (target == m);
/// \brief Processes the next node.
/// Processes the next node and checks if at least one of reached
/// nodes has \c true value in the \c nm node map. If one node
/// with \c true value is reachable from the processed node, then the
/// \c rnode parameter will be set to the first of such nodes.
/// \param nm A \c bool (or convertible) node map that indicates the
/// \retval rnode The reached target node.
/// It should be initially \c INVALID.
/// \return The processed node.
/// \pre The queue must not be empty.
Node processNextNode(const NM& nm, Node& rnode) {
Node n = _list[++_list_front];
for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
Node m = _digraph->target(e);
if (nm[m] && rnode == INVALID) rnode = m;
/// \brief The next node to be processed.
/// Returns the next node to be processed or \c INVALID if the queue
return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
/// \brief Returns \c false if there are nodes
/// Returns \c false if there are nodes
/// to be processed in the queue.
bool emptyQueue() const { return _list_front == _list_back; }
/// \brief Returns the number of the nodes to be processed.
/// Returns the number of the nodes to be processed in the queue.
int queueSize() const { return _list_back - _list_front; }
/// \brief Executes the algorithm.
/// Executes the algorithm.
/// This method runs the %BFS algorithm from the root node(s)
/// in order to compute the shortest path to each node.
/// The algorithm computes
/// - the shortest path tree (forest),
/// - the distance of each node from the root(s).
/// \pre init() must be called and at least one root node should be added
/// with addSource() before using this function.
/// \note <tt>b.start()</tt> is just a shortcut of the following code.
/// while ( !b.emptyQueue() ) {
while ( !emptyQueue() ) processNextNode();
/// \brief Executes the algorithm until the given target node is reached.
/// Executes the algorithm until the given target node is reached.
/// This method runs the %BFS algorithm from the root node(s)
/// in order to compute the shortest path to \c dest.
/// The algorithm computes
/// - the shortest path to \c dest,
/// - the distance of \c dest from the root(s).
/// \pre init() must be called and at least one root node should be
/// added with addSource() before using this function.
/// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
/// while ( !b.emptyQueue() && !reach ) {
/// b.processNextNode(t, reach);
while ( !emptyQueue() && !reach ) processNextNode(dest, reach);
/// \brief Executes the algorithm until a condition is met.
/// Executes the algorithm until a condition is met.
/// This method runs the %BFS algorithm from the root node(s) in
/// order to compute the shortest path to a node \c v with
/// <tt>nm[v]</tt> true, if such a node can be found.
/// \param nm must be a bool (or convertible) node map. The
/// algorithm will stop when it reaches a node \c v with
/// \return The reached node \c v with <tt>nm[v]</tt> true or
/// \c INVALID if no such node was found.
/// \pre init() must be called and at least one root node should be
/// added with addSource() before using this function.
/// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
/// Node rnode = INVALID;
/// while ( !b.emptyQueue() && rnode == INVALID ) {
/// b.processNextNode(nm, rnode);
Node start(const NM &nm) {
while ( !emptyQueue() && rnode == INVALID ) {
processNextNode(nm, rnode);
/// \brief Runs the algorithm from the given node.
/// This method runs the %BFS algorithm from node \c s
/// in order to compute the shortest path to each node.
/// The algorithm computes
/// - the shortest path tree,
/// - the distance of each node from the root.
/// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
/// \brief Runs the algorithm to visit all nodes in the digraph.
/// This method runs the %BFS algorithm in order to
/// compute the shortest path to each node.
/// The algorithm computes
/// - the shortest path tree (forest),
/// - the distance of each node from the root(s).
/// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
/// for (NodeIt n(gr); n != INVALID; ++n) {
for (NodeIt it(*_digraph); it != INVALID; ++it) {
/// \name Query Functions
/// The result of the %BFS algorithm can be obtained using these
/// Either \ref lemon::BfsVisit::run() "run()" or
/// \ref lemon::BfsVisit::start() "start()" must be called before
/// \brief Checks if a node is reachable from the root(s).
/// Returns \c true if \c v is reachable from the root(s).
/// \pre Either \ref run() or \ref start()
/// must be called before using this function.
bool reached(Node v) { return (*_reached)[v]; }
} //END OF NAMESPACE LEMON