* 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/graph_utils.h>
#include <lemon/bits/path_dump.h>
#include <lemon/bits/invalid.h>
///Default traits class of Bfs class.
///Default traits class of Bfs class.
///\tparam GR Digraph type.
///The digraph type the algorithm runs on.
///\brief The type of the map that stores the last
///arcs of the shortest paths.
///The type of the map that stores the last
///arcs of the shortest paths.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
///Instantiates a PredMap.
///This function instantiates a \ref PredMap.
///\param G is the digraph, to which we would like to define the PredMap.
///\todo The digraph alone may be insufficient to initialize
static PredMap *createPredMap(const GR &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.
///\todo named parameter to set this type, function to read and write.
typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
///Instantiates a 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 GR &g)
static ProcessedMap *createProcessedMap(const GR &)
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::WriteMap "WriteMap" concept.
///\todo named parameter to set this type, function to read and write.
typedef typename Digraph::template NodeMap<bool> ReachedMap;
///Instantiates a 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 GR &G)
return new ReachedMap(G);
///The type of the map that stores the dists of the nodes.
///The type of the map that stores the dists of the nodes.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef typename Digraph::template NodeMap<int> DistMap;
///Instantiates a DistMap.
///This function instantiates a \ref DistMap.
///\param G is the digraph, to which we would like to define the \ref DistMap
static DistMap *createDistMap(const GR &G)
///This class provides an efficient implementation of the %BFS algorithm.
///\tparam GR The digraph type the algorithm runs on. The default value is
///\ref ListDigraph. The value of GR is not used directly by 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> >
* \brief \ref Exception for uninitialized parameters.
* This error represents problems in the initialization
* of the parameters of the algorithms.
class UninitializedParameter : public lemon::UninitializedParameter {
virtual const char* what() const throw() {
return "lemon::Bfs::UninitializedParameter";
///The type of the underlying digraph.
typedef typename TR::Digraph Digraph;
///\brief The type of the map that stores the last
///arcs of the shortest paths.
typedef typename TR::PredMap PredMap;
///The type of the map indicating which nodes are reached.
typedef typename TR::ReachedMap ReachedMap;
///The type of the map indicating which nodes are processed.
typedef typename TR::ProcessedMap ProcessedMap;
///The type of the map that stores the dists of the nodes.
typedef typename TR::DistMap DistMap;
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 predecessors arcs.
///Indicates if \ref _pred is locally allocated (\c true) or not.
///Pointer to the map of distances.
///Indicates if \ref _dist is locally allocated (\c true) or not.
///Pointer to the map of reached status of the nodes.
///Indicates if \ref _reached is locally allocated (\c true) or not.
///Pointer to the map of processed status of the nodes.
ProcessedMap *_processed;
///Indicates if \ref _processed is locally allocated (\c 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 PredMap type
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 DistMap type
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 ReachedMap type
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 named-templ-param "Named parameter" for setting 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 the ProcessedMap type to be Digraph::NodeMap<bool>.
///\ref named-templ-param "Named parameter"
///for setting the ProcessedMap type to be Digraph::NodeMap<bool>.
///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 will run 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 storing the predecessor arcs.
///Sets the map storing 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 indicating the reached nodes.
///Sets the map indicating the reached nodes.
///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 indicating the processed nodes.
///Sets the map indicating the processed nodes.
///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 storing the distances calculated by the algorithm.
///Sets the map storing the distances calculated by the algorithm.
///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 \c run(...).
///If you need more control on the execution,
///first you must call \ref init(), then you can add several source nodes
///with \ref addSource().
///Finally \ref start() will perform the actual path
///\brief 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.
///\warning 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 that the given target node
///is reached. If the target node is reachable from the processed
///node then the reached parameter will be set true. The reached
///parameter should be initially false.
///\param target The target node.
///\retval reach Indicates that the target node is reached.
///\return The processed node.
///\warning 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 that at least one of
///reached node has true value in the \c nm node map. If one node
///with true value is reachable from the processed node then the
///rnode parameter will be set to the first of such nodes.
///\param nm The node map of possible targets.
///\retval rnode The reached target node.
///\return The processed node.
///\warning 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;
///Next node to be processed.
///Next node to be processed.
///\return The next node to be processed or INVALID if the queue is
return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
///\brief Returns \c false if there are nodes
///to be processed in the queue
///Returns \c false if there are nodes
///to be processed in the queue
bool emptyQueue() { 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() { return _queue_head-_queue_tail; }
///Executes the algorithm.
///Executes the algorithm.
///\pre init() must be called and at least one node should be added
///with addSource() before using this function.
///This method runs the %BFS algorithm from the root node(s)
///shortest path to each node. The algorithm computes
///- The shortest path tree.
///- The distance of each node from the root(s).
while ( !emptyQueue() ) processNextNode();
///Executes the algorithm until \c dest is reached.
///Executes the algorithm until \c dest is reached.
///\pre init() must be called and at least one node should be added
///with addSource() before using this function.
///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).
while ( !emptyQueue() && !reach ) processNextNode(dest, reach);
///Executes the algorithm until a condition is met.
///Executes the algorithm until a condition is met.
///\pre init() must be called and at least one node should be added
///with addSource() before using this function.
///\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.
while ( !emptyQueue() && rnode == INVALID ) {
processNextNode(nm, rnode);
///Runs %BFS algorithm from node \c s.
///This method runs the %BFS algorithm from a root node \c s
///shortest path to each node. The algorithm computes
///- The shortest path tree.
///- The distance of each node from the root.
///\note b.run(s) is just a shortcut of the following code.
///Finds the shortest path between \c s and \c t.
///Finds the shortest path between \c s and \c t.
///\return The length of the shortest s---t path if there exists one,
///\note Apart from the return value, b.run(s) is
///just a shortcut of the following code.
return reached(t) ? _curr_dist : 0;
///The result of the %BFS algorithm can be obtained using these
///Before the use of these functions,
///either run() or start() must be calleb.
typedef PredMapPath<Digraph, PredMap> Path;
///Gives back the shortest path.
///Gives back the shortest path.
///\pre The \c t should be reachable from the source.
return Path(*G, *_pred, t);
///The distance of a node from the root(s).
///Returns the distance of a node from the root(s).
///\pre \ref run() must be called before using this function.
///\warning If node \c v in unreachable from the root(s) the return value
///of this function is undefined.
int dist(Node v) const { return (*_dist)[v]; }
///Returns the 'previous arc' of the shortest path tree.
///For a node \c v it returns the 'previous arc'
///of the shortest path tree,
///i.e. it returns the last arc of a shortest path from the root(s) to \c
///if \c v is unreachable from the root(s) or \c v is a root. The
///shortest path tree used here is equal to the shortest path tree used in
///\pre Either \ref run() or \ref start() must be called before using
Arc predArc(Node v) const { return (*_pred)[v];}
///Returns the 'previous node' of the shortest path tree.
///For a node \c v it returns the 'previous node'
///of the shortest path tree,
///i.e. it returns the last but one node from a shortest path from the
///It is INVALID if \c v is unreachable from the root(s) or
///if \c v itself 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]); }
///Returns a reference to the NodeMap of distances.
///Returns a reference to the NodeMap of distances.
///\pre Either \ref run() or \ref init() must
///be called before using this function.
const DistMap &distMap() const { return *_dist;}
///Returns a reference to the shortest path tree map.
///Returns a reference to the NodeMap of the arcs of the
///\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.
///Returns \c true if \c v is reachable from the root.
///\warning The source nodes are indicated as unreached.
///\pre Either \ref run() or \ref start()
///must be called before using this function.
bool reached(Node v) { return (*_reached)[v]; }
///Default traits class of Bfs function.
///Default traits class of Bfs function.
///\tparam GR Digraph type.
struct BfsWizardDefaultTraits
///The digraph type the algorithm runs on.
///\brief The type of the map that stores the last
///arcs of the shortest paths.
///The type of the map that stores the last
///arcs of the shortest paths.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef NullMap<typename Digraph::Node,typename GR::Arc> PredMap;
///Instantiates a PredMap.
///This function instantiates a \ref PredMap.
///\param g is the digraph, to which we would like to define the PredMap.
///\todo The digraph alone may be insufficient to initialize
static PredMap *createPredMap(const GR &g)
static PredMap *createPredMap(const GR &)
///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.
///\todo named parameter to set this type, function to read and write.
typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
///Instantiates a 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 GR &g)
static ProcessedMap *createProcessedMap(const GR &)
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::WriteMap "WriteMap" concept.
///\todo named parameter to set this type, function to read and write.
typedef typename Digraph::template NodeMap<bool> ReachedMap;
///Instantiates a 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 GR &G)
return new ReachedMap(G);
///The type of the map that stores the dists of the nodes.
///The type of the map that stores the dists of the nodes.
///It must meet the \ref concepts::WriteMap "WriteMap" concept.
typedef NullMap<typename Digraph::Node,int> DistMap;
///Instantiates a DistMap.
///This function instantiates a \ref DistMap.
///\param g is the digraph, to which we would like to define the \ref DistMap
static DistMap *createDistMap(const GR &g)
static DistMap *createDistMap(const GR &)
/// Default traits 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;
/// Type of the nodes in the digraph.
typedef typename Base::Digraph::Node Node;
/// Pointer to the underlying digraph.
///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 is the initial value of \ref _g
/// \param s is the initial value of \ref _source
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) {}
/// A class to make the usage of Bfs algorithm easier
/// This class is created to make it easier to use Bfs algorithm.
/// It uses the functions and features of the plain \ref Bfs,
/// but it is much simpler to use it.
/// 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 class, and calls the \ref Bfs::run
class BfsWizard : public TR
///The type of the underlying digraph.
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
typedef typename TR::ReachedMap ReachedMap;
///\brief The type of the map that stores
typedef typename TR::ProcessedMap ProcessedMap;
///\brief The type of the map that stores the last
///arcs of the shortest paths.
typedef typename TR::PredMap PredMap;
///The type of the map that stores the dists of the nodes.
typedef typename TR::DistMap DistMap;
/// 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 given node.
///Runs Bfs algorithm from a given node.
///The node can be given by 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.
struct DefPredMapBase : public Base {
static PredMap *createPredMap(const Digraph &) { return 0; };
DefPredMapBase(const TR &b) : TR(b) {}
///\brief \ref named-templ-param "Named parameter"
///function for setting PredMap
/// \ref named-templ-param "Named parameter"
///function for setting PredMap
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"
///function for setting ReachedMap
/// \ref named-templ-param "Named parameter"
///function for setting ReachedMap
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"
///function for setting ProcessedMap
/// \ref named-templ-param "Named parameter"
///function for setting ProcessedMap
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"
///function for setting DistMap type
/// \ref named-templ-param "Named parameter"
///function for setting DistMap type
BfsWizard<DefDistMapBase<T> > distMap(const T &t)
Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
return BfsWizard<DefDistMapBase<T> >(*this);
/// 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)
///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 when the arc reach a node.
/// It is called when the bfs find an arc which target is not
void discover(const Arc& arc) {}
/// \brief Called when the node reached first time.
/// It is Called when the node reached first time.
void reach(const Node& node) {}
/// \brief Called when the arc examined but target of the arc
/// It called when the arc examined but the target of the arc
void examine(const Arc& arc) {}
/// \brief Called for the source node of the bfs.
/// It is called for the source node of the bfs.
void start(const Node& node) {}
/// \brief Called when the node processed.
/// It is Called when the node processed.
void process(const Node& node) {}
template <typename _Digraph>
typedef _Digraph Digraph;
typedef typename Digraph::Arc Arc;
typedef typename Digraph::Node Node;
void discover(const Arc&) {}
void reach(const Node&) {}
void examine(const Arc&) {}
void start(const Node&) {}
void process(const Node&) {}
template <typename _Visitor>
/// \brief Default traits class of BfsVisit class.
/// Default traits class of BfsVisit class.
/// \tparam _Digraph Digraph type.
struct BfsVisitDefaultTraits {
/// \brief The digraph type 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::WriteMap "WriteMap" concept.
/// \todo named parameter to set this type, function to read and write.
typedef typename Digraph::template NodeMap<bool> ReachedMap;
/// \brief Instantiates a 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 Visit algorithm class.
/// 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
/// on every bfs event the \c Visitor class member functions.
/// \tparam _Digraph The digraph type the algorithm runs on. The default value is
/// \ref ListDigraph. The value of _Digraph is not used directly by Bfs, it
/// is only passed to \ref BfsDefaultTraits.
/// \tparam _Visitor The Visitor object for the algorithm. The
/// \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 algorithms.
class UninitializedParameter : public lemon::UninitializedParameter {
virtual const char* what() const throw()
return "lemon::BfsVisit::UninitializedParameter";
typedef typename Traits::Digraph Digraph;
typedef _Visitor Visitor;
///The type of the map indicating 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 \ref _reached is locally allocated (\c true) or not.
std::vector<typename Digraph::Node> _list;
int _list_front, _list_back;
/// \brief Creates the maps if necessary.
/// Creates the maps if necessary.
_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 will run on.
/// \param visitor The visitor 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 indicating if a node is reached.
/// Sets the map indicating if a node is reached.
/// If you don't use this function before calling \ref run(),
/// it will allocate one. The destuctor 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 \c run(...).
/// If you need more control on the execution,
/// first you must call \ref init(), then you can adda source node
/// with \ref addSource().
/// Finally \ref start() will perform the actual path
/// \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 that the given target node
/// is reached. If the target node is reachable from the processed
/// node then the reached parameter will be set true. The reached
/// parameter should be initially false.
/// \param target The target node.
/// \retval reach Indicates that the target node is reached.
/// \return The processed node.
/// \warning 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 that at least one of
/// reached node has true value in the \c nm node map. If one node
/// with true value is reachable from the processed node then the
/// rnode parameter will be set to the first of such nodes.
/// \param nm The node map of possible targets.
/// \retval rnode The reached target node.
/// \return The processed node.
/// \warning 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 Next node to be processed.
/// Next node to be processed.
/// \return The next node to be processed or INVALID if the stack is
return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
/// \brief Returns \c false if there are nodes
/// to be processed in the queue
/// Returns \c false if there are nodes
/// to be processed in the queue
bool emptyQueue() { 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() { return _list_back - _list_front; }
/// \brief Executes the algorithm.
/// Executes the algorithm.
/// \pre init() must be called and at least one node should be added
/// with addSource() before using this function.
while ( !emptyQueue() ) processNextNode();
/// \brief Executes the algorithm until \c dest is reached.
/// Executes the algorithm until \c dest is reached.
/// \pre init() must be called and at least one node should be added
/// with addSource() before using this function.
while ( !emptyQueue() && !reach ) processNextNode(dest, reach);
/// \brief Executes the algorithm until a condition is met.
/// Executes the algorithm until a condition is met.
/// \pre init() must be called and at least one node should be added
/// with addSource() before using this function.
///\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.
Node start(const NM &nm) {
while ( !emptyQueue() && rnode == INVALID ) {
processNextNode(nm, rnode);
/// \brief Runs %BFSVisit algorithm from node \c s.
/// This method runs the %BFS algorithm from a root node \c s.
/// \note b.run(s) is just a shortcut of the following code.
/// \brief Runs %BFSVisit algorithm to visit all nodes in the digraph.
/// This method runs the %BFS algorithm in order to
/// compute the %BFS path to each node. The algorithm computes
/// - The distance of each node from the root in the %BFS tree.
///\note b.run() is just a shortcut of the following code.
/// for (NodeIt it(digraph); it != INVALID; ++it) {
/// if (!b.reached(it)) {
for (NodeIt it(*_digraph); it != INVALID; ++it) {
/// \name Query Functions
/// The result of the %BFS algorithm can be obtained using these
/// Before the use of these functions,
/// either run() or start() must be called.
/// \brief Checks if a node is reachable from the root.
/// Returns \c true if \c v is reachable from the root(s).
/// \warning The source nodes are inditated as unreachable.
/// \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