Classes | Public Types | Public Member Functions

BfsVisit< GR, VS, TR > Class Template Reference


Detailed Description

template<typename GR, typename VS, typename TR>
class lemon::BfsVisit< GR, VS, TR >

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 Visitor class on every BFS event.

This interface of the BFS algorithm should be used in special cases when extra actions have to be performed in connection with certain events of the BFS algorithm. Otherwise consider to use Bfs or bfs() instead.

Template Parameters:
GRThe type of the digraph the algorithm runs on. The default type is ListDigraph. The value of GR is not used directly by BfsVisit, it is only passed to BfsVisitDefaultTraits.
VSThe Visitor type that is used by the algorithm. BfsVisitor<GR> 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.
TRThe traits class that defines various types used by the algorithm. By default, it is BfsVisitDefaultTraits<GR>. In most cases, this parameter should not be set directly, consider to use the named template parameters instead.

#include <lemon/bfs.h>

List of all members.

Classes

struct  SetReachedMap

Public Types

typedef TR Traits
 The traits class.
typedef Traits::Digraph Digraph
 The type of the digraph the algorithm runs on.
typedef VS Visitor
 The visitor type used by the algorithm.
typedef Traits::ReachedMap ReachedMap
 The type of the map that indicates which nodes are reached.

Public Member Functions

 BfsVisit (const Digraph &digraph, Visitor &visitor)
 Constructor.
 ~BfsVisit ()
 Destructor.
BfsVisitreachedMap (ReachedMap &m)
 Sets the map that indicates which nodes are reached.
Execution Control

The simplest way to execute the BFS algorithm is to use one of the member functions called run().
If you need better control on the execution, you have to call init() first, then you can add several source nodes with addSource(). Finally the actual path computation can be performed with one of the start() functions.

void init ()
void addSource (Node s)
 Adds a new source node.
Node processNextNode ()
 Processes the next node.
Node processNextNode (Node target, bool &reach)
 Processes the next node.
template<typename NM >
Node processNextNode (const NM &nm, Node &rnode)
 Processes the next node.
Node nextNode () const
 The next node to be processed.
bool emptyQueue () const
 Returns false if there are nodes to be processed.
int queueSize () const
 Returns the number of the nodes to be processed.
void start ()
 Executes the algorithm.
void start (Node t)
 Executes the algorithm until the given target node is reached.
template<typename NM >
Node start (const NM &nm)
 Executes the algorithm until a condition is met.
void run (Node s)
 Runs the algorithm from the given source node.
bool run (Node s, Node t)
 Finds the shortest path between s and t.
void run ()
 Runs the algorithm to visit all nodes in the digraph.
Query Functions

The results of the BFS algorithm can be obtained using these functions.
Either run() or start() should be called before using them.

bool reached (Node v) const
 Checks if the given node is reached from the root(s).

Constructor & Destructor Documentation

BfsVisit ( const Digraph digraph,
Visitor visitor 
) [inline]

Constructor.

Parameters:
digraphThe digraph the algorithm runs on.
visitorThe visitor object of the algorithm.

Member Function Documentation

BfsVisit& reachedMap ( ReachedMap m) [inline]

Sets the map that indicates which nodes are reached. If you don't use this function before calling run() or init(), an instance will be allocated automatically. The destructor deallocates this automatically allocated map, of course.

Returns:
(*this)
void init ( ) [inline]

Initializes the internal data structures.

void addSource ( Node  s) [inline]

Adds a new source node to the set of nodes to be processed.

Node processNextNode ( ) [inline]

Processes the next node.

Returns:
The processed node.
Precondition:
The queue must not be empty.
Node processNextNode ( Node  target,
bool &  reach 
) [inline]

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 reach parameter will be set to true.

Parameters:
targetThe target node.
Return values:
reachIndicates if the target node is reached. It should be initially false.
Returns:
The processed node.
Precondition:
The queue must not be empty.
Node processNextNode ( const NM &  nm,
Node &  rnode 
) [inline]

Processes the next node and checks if at least one of reached nodes has true value in the 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.

Parameters:
nmA bool (or convertible) node map that indicates the possible targets.
Return values:
rnodeThe reached target node. It should be initially INVALID.
Returns:
The processed node.
Precondition:
The queue must not be empty.
Node nextNode ( ) const [inline]

Returns the next node to be processed or INVALID if the queue is empty.

bool emptyQueue ( ) const [inline]

Returns false if there are nodes to be processed in the queue.

int queueSize ( ) const [inline]

Returns the number of the nodes to be processed in the queue.

void start ( ) [inline]

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).
Precondition:
init() must be called and at least one root node should be added with addSource() before using this function.
Note:
b.start() is just a shortcut of the following code.
   while ( !b.emptyQueue() ) {
     b.processNextNode();
   }
void start ( Node  t) [inline]

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 t.

The algorithm computes

  • the shortest path to t,
  • the distance of t from the root(s).
Precondition:
init() must be called and at least one root node should be added with addSource() before using this function.
Note:
b.start(t) is just a shortcut of the following code.
   bool reach = false;
   while ( !b.emptyQueue() && !reach ) {
     b.processNextNode(t, reach);
   }
Node start ( const NM &  nm) [inline]

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 v with nm[v] true, if such a node can be found.

Parameters:
nmmust be a bool (or convertible) node map. The algorithm will stop when it reaches a node v with nm[v] true.
Returns:
The reached node v with nm[v] true or INVALID if no such node was found.
Precondition:
init() must be called and at least one root node should be added with addSource() before using this function.
Note:
b.start(nm) is just a shortcut of the following code.
   Node rnode = INVALID;
   while ( !b.emptyQueue() && rnode == INVALID ) {
     b.processNextNode(nm, rnode);
   }
   return rnode;
void run ( Node  s) [inline]

This method runs the BFS algorithm from node 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:
b.run(s) is just a shortcut of the following code.
          b.init();
          b.addSource(s);
          b.start();
bool run ( Node  s,
Node  t 
) [inline]

This method runs the BFS algorithm from node s in order to compute the shortest path to node t (it stops searching when t is processed).

Returns:
true if t is reachable form s.
Note:
Apart from the return value, b.run(s,t) is just a shortcut of the following code.
          b.init();
          b.addSource(s);
          b.start(t);
void run ( ) [inline]

This method runs the BFS algorithm in order to visit all nodes in the digraph.

Note:
b.run(s) is just a shortcut of the following code.
         b.init();
         for (NodeIt n(gr); n != INVALID; ++n) {
           if (!b.reached(n)) {
             b.addSource(n);
             b.start();
           }
         }
bool reached ( Node  v) const [inline]

Returns true if v is reached from the root(s).

Precondition:
Either run() or init() must be called before using this function.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines