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.
GR | The 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. |
VS | The 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. |
TR | The 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>
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. | |
BfsVisit & | reachedMap (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(). | |
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 | |
bool | reached (Node v) const |
Checks if the given node is reached from the root(s). |
Constructor.
digraph | The digraph the algorithm runs on. |
visitor | The visitor object of the algorithm. |
BfsVisit& reachedMap | ( | ReachedMap & | m | ) | [inline] |
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.
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
.
target | The target node. |
reach | Indicates if the target node is reached. It should be initially false . |
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.
nm | A bool (or convertible) node map that indicates the possible targets. |
rnode | The reached target node. It should be initially INVALID . |
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
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
t
,t
from the root(s).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.
nm | must be a bool (or convertible) node map. The algorithm will stop when it reaches a node v with nm[v] true. |
v
with nm[v]
true or INVALID
if no such node was found.b.start(nm)
is just a shortcut of the following code. 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
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).
true
if t
is reachable form s
.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.
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(); } }