All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
List of all members | Classes | Public Types | Public Member Functions
DfsVisit< GR, VS, TR > Class Template Reference

Detailed Description

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

This class provides an efficient implementation of the DFS algorithm with visitor interface.

The DfsVisit class provides an alternative interface to the Dfs class. It works with callback mechanism, the DfsVisit object calls the member functions of the Visitor class on every DFS event.

This interface of the DFS algorithm should be used in special cases when extra actions have to be performed in connection with certain events of the DFS algorithm. Otherwise consider to use Dfs or dfs() 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 DfsVisit, it is only passed to DfsVisitDefaultTraits.
VSThe Visitor type that is used by the algorithm. DfsVisitor<GR> is an empty visitor, which does not observe the DFS events. If you want to observe the DFS events, you should implement your own visitor class.
TRTraits class to set various data types used by the algorithm. The default traits class is DfsVisitDefaultTraits<GR>. See DfsVisitDefaultTraits for the documentation of a DFS visit traits class.

#include <lemon/dfs.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

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

The simplest way to execute the DFS algorithm is to use one of the member functions called run().
If you need more control on the execution, first you have to call init(), then you can add a source node with addSource() and perform the actual computation with start(). This procedure can be repeated if there are nodes that have not been reached.

void init ()
 
void addSource (Node s)
 Adds a new source node.
 
Arc processNextArc ()
 Processes the next arc.
 
Arc nextArc () const
 Next arc 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 AM >
Arc start (const AM &am)
 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 DFS path between s and t.
 
void run ()
 Runs the algorithm to visit all nodes in the digraph.
 
Query Functions

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

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

Constructor & Destructor Documentation

DfsVisit ( const Digraph digraph,
Visitor visitor 
)
inline

Constructor.

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

Member Function Documentation

DfsVisit& 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.

Precondition
The stack must be empty. Otherwise the algorithm gives wrong results. (One of the outgoing arcs of all the source nodes except for the last one will not be visited and distances will also be wrong.)
Arc processNextArc ( )
inline

Processes the next arc.

Returns
The processed arc.
Precondition
The stack must not be empty.
Arc nextArc ( ) const
inline

Next arc to be processed.

Returns
The next arc to be processed or INVALID if the stack is empty.
bool emptyQueue ( ) const
inline

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

int queueSize ( ) const
inline

Returns the number of the nodes to be processed in the queue (stack).

void start ( )
inline

Executes the algorithm.

This method runs the DFS algorithm from the root node in order to compute the DFS path to each node.

The algorithm computes

  • the DFS tree,
  • the distance of each node from the root in the DFS tree.
Precondition
init() must be called and a root node should be added with addSource() before using this function.
Note
d.start() is just a shortcut of the following code.
while ( !d.emptyQueue() ) {
d.processNextArc();
}
void start ( Node  t)
inline

Executes the algorithm until the given target node is reached.

This method runs the DFS algorithm from the root node in order to compute the DFS path to t.

The algorithm computes

  • the DFS path to t,
  • the distance of t from the root in the DFS tree.
Precondition
init() must be called and a root node should be added with addSource() before using this function.
Arc start ( const AM &  am)
inline

Executes the algorithm until a condition is met.

This method runs the DFS algorithm from the root node until an arc a with am[a] true is found.

Parameters
amA bool (or convertible) arc map. The algorithm will stop when it reaches an arc a with am[a] true.
Returns
The reached arc a with am[a] true or INVALID if no such arc was found.
Precondition
init() must be called and a root node should be added with addSource() before using this function.
Warning
Contrary to Bfs and Dijkstra, am is an arc map, not a node map.
void run ( Node  s)
inline

This method runs the DFS algorithm from node s. in order to compute the DFS path to each node.

The algorithm computes

  • the DFS tree,
  • the distance of each node from the root in the DFS tree.
Note
d.run(s) is just a shortcut of the following code.
d.init();
d.addSource(s);
d.start();
bool run ( Node  s,
Node  t 
)
inline

This method runs the DFS algorithm from node s in order to compute the DFS 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, d.run(s,t) is just a shortcut of the following code.
d.init();
d.addSource(s);
d.start(t);
void run ( )
inline

This method runs the DFS algorithm in order to compute the DFS path to each node.

The algorithm computes

  • the DFS tree (forest),
  • the distance of each node from the root(s) in the DFS tree.
Note
d.run() is just a shortcut of the following code.
d.init();
for (NodeIt n(digraph); n != INVALID; ++n) {
if (!d.reached(n)) {
d.addSource(n);
d.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.