Loading...
Searching...
No Matches
Dijkstra< GR, LEN, TR > Class Template Reference
Algorithms » Shortest Path Algorithms

## Detailed Description

template<typename GR, typename LEN, typename TR>
class lemon::Dijkstra< GR, LEN, TR >

This class provides an efficient implementation of the Dijkstra algorithm.

The Dijkstra algorithm solves the single-source shortest path problem when all arc lengths are non-negative. If there are negative lengths, the BellmanFord algorithm should be used instead.

The arc lengths are passed to the algorithm using a ReadMap, so it is easy to change it to any kind of length. The type of the length is determined by the Value of the length map. It is also possible to change the underlying priority heap.

There is also a function-type interface for the Dijkstra algorithm, which is convenient in the simplier cases and it can be used easier.

Template Parameters

  GR | The type of the digraph the algorithm runs on. The default type is ListDigraph.
  LEN | A readable arc map that specifies the lengths of the arcs. It is read once for each arc, so the map may involve in relatively time consuming process to compute the arc lengths if it is necessary. The default map type is GR::ArcMap<int>.
  TR | The traits class that defines various types used by the algorithm. By default, it is DijkstraDefaultTraits<GR, LEN>. In most cases, this parameter should not be set directly, consider to use the named template parameters instead.

`#include <lemon/dijkstra.h>`

Inheritance diagram for Dijkstra< GR, LEN, TR >:
[legend]

## Classes

struct | SetPredMap
| Named parameter for setting More...
struct | SetDistMap
| Named parameter for setting More...
struct | SetProcessedMap
| Named parameter for setting More...
struct | SetStandardProcessedMap
| Named parameter for setting More...
struct | SetHeap
| Named parameter for setting heap and cross reference types More...
struct | SetStandardHeap
| Named parameter for setting heap and cross reference types with automatic allocation More...
struct | SetOperationTraits
| Named parameter for setting More...

## Public Types

typedef TR::Digraph | Digraph
| The type of the digraph the algorithm runs on.
typedef TR::Value | Value
| The type of the arc lengths.
typedef TR::LengthMap | LengthMap
| The type of the map that stores the arc lengths.
typedef TR::PredMap | PredMap
| The type of the map that stores the predecessor arcs of the shortest paths.
typedef TR::DistMap | DistMap
| The type of the map that stores the distances of the nodes.
typedef TR::ProcessedMap | ProcessedMap
| The type of the map that indicates which nodes are processed.
typedef PredMapPath< Digraph, PredMap > | Path
| The type of the paths.
typedef TR::HeapCrossRef | HeapCrossRef
| The cross reference type used for the current heap.
typedef TR::Heap | Heap
| The heap type used by the algorithm.
typedef TR::OperationTraits | OperationTraits
| The operation traits class of the algorithm.
typedef TR | Traits
| The traits class of the algorithm.

## Public Member Functions

| Dijkstra (const Digraph &g, const LengthMap &length)
| Constructor.
| ~Dijkstra ()
| Destructor.
Dijkstra & | lengthMap (const LengthMap &m)
| Sets the length map.
Dijkstra & | predMap (PredMap &m)
| Sets the map that stores the predecessor arcs.
Dijkstra & | processedMap (ProcessedMap &m)
| Sets the map that indicates which nodes are processed.
Dijkstra & | distMap (DistMap &m)
| Sets the map that stores the distances of the nodes.
Dijkstra & | heap (Heap &hp, HeapCrossRef &cr)
| Sets the heap and the cross reference used by algorithm.
Execution Control
The simplest way to execute the Dijkstra algorithm is to use one of the member functions called run(). If you need better control on the execution, you have to call
void | init ()
| Initializes the internal data structures.
void | addSource (Node s, Value dst=OperationTraits::zero())
| Adds a new source node.
Node | processNextNode ()
| Processes the next node in the priority heap.
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 processed.
template<class NodeBoolMap>
Node | start (const NodeBoolMap &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`.
Query Functions
The results of the Dijkstra algorithm can be obtained using these functions. Either run() or init() should be called before using them.
Path | path (Node t) const
| The shortest path to the given node.
Value | dist (Node v) const
| The distance of the given node from the root(s).
Arc | predArc (Node v) const
| Returns the 'previous arc' of the shortest path tree for the given node.
Node | predNode (Node v) const
| Returns the 'previous node' of the shortest path tree for the given node.
const DistMap & | distMap () const
| Returns a const reference to the node map that stores the distances of the nodes.
const PredMap & | predMap () const
| Returns a const reference to the node map that stores the predecessor arcs.
bool | reached (Node v) const
| Checks if the given node is reached from the root(s).
bool | processed (Node v) const
| Checks if a node is processed.
Value | currentDist (Node v) const
| The current distance of the given node from the root(s).

## Constructor & Destructor Documentation

## Dijkstra()

template<typename GR, typename LEN, typename TR>

Dijkstra | ( | const Digraph & | g,
|  | const LengthMap & | length )

inline

Constructor.

Parameters

  g | The digraph the algorithm runs on.
  length | The length map used by the algorithm.

## Member Function Documentation

## lengthMap()

template<typename GR, typename LEN, typename TR>

Dijkstra & lengthMap | ( | const LengthMap & | m | ) |

inline

Sets the length map.

Returns
  (*this)

## predMap() [1/2]

template<typename GR, typename LEN, typename TR>

Dijkstra & predMap | ( | PredMap & | m | ) |

inline

Sets the map that stores the predecessor arcs. 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)

## processedMap()

template<typename GR, typename LEN, typename TR>

Dijkstra & processedMap | ( | ProcessedMap & | m | ) |

inline

Sets the map that indicates which nodes are processed. 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)

## distMap() [1/2]

template<typename GR, typename LEN, typename TR>

Dijkstra & distMap | ( | DistMap & | m | ) |

inline

Sets the map that stores the distances of the nodes calculated by the algorithm. 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)

## heap()

template<typename GR, typename LEN, typename TR>

Dijkstra & heap | ( | Heap & | hp,
|  | HeapCrossRef & | cr )

inline

Sets the heap and the cross reference used by algorithm. If you don't use this function before calling run() or init(), heap and cross reference instances will be allocated automatically. The destructor deallocates these automatically allocated objects, of course.

Returns
  (*this)

## init()

template<typename GR, typename LEN, typename TR>

void init | ( |  | ) |

inline

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.

Initializes the internal data structures.

## addSource()

template<typename GR, typename LEN, typename TR>

void addSource | ( | Node | s,
|  | Value | dst = OperationTraits::zero() )

inline

Adds a new source node to the priority heap. The optional second parameter is the initial distance of the node.

The function checks if the node has already been added to the heap and it is pushed to the heap only if either it was not in the heap or the shortest path found till then is shorter than `dst`.

## processNextNode()

template<typename GR, typename LEN, typename TR>

Node processNextNode | ( |  | ) |

inline

Processes the next node in the priority heap.

Returns
  The processed node.

Warning
  The priority heap must not be empty.

## nextNode()

template<typename GR, typename LEN, typename TR>

Node nextNode | ( |  | ) | const

inline

Returns the next node to be processed or `INVALID` if the priority heap is empty.

## emptyQueue()

template<typename GR, typename LEN, typename TR>

bool emptyQueue | ( |  | ) | const

inline

Returns `false` if there are nodes to be processed in the priority heap.

## queueSize()

template<typename GR, typename LEN, typename TR>

int queueSize | ( |  | ) | const

inline

Returns the number of the nodes to be processed in the priority heap.

## start() [1/3]

template<typename GR, typename LEN, typename TR>

void start | ( |  | ) |

inline

Executes the algorithm.

This method runs the Dijkstra 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
    d.start() is just a shortcut of the following code.
    while ( !d.emptyQueue() ) {
    d.processNextNode();
    }

## start() [2/3]

template<typename GR, typename LEN, typename TR>

void start | ( | Node | t | ) |

inline

Executes the algorithm until the given target node is processed.

This method runs the Dijkstra 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.

## start() [3/3]

template<typename GR, typename LEN, typename TR>
template<class NodeBoolMap>

Node start | ( | const NodeBoolMap & | nm | ) |

inline

Executes the algorithm until a condition is met.

This method runs the Dijkstra 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

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

## run() [1/2]

template<typename GR, typename LEN, typename TR>

void run | ( | Node | s | ) |

inline

This method runs the Dijkstra 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
    d.run(s) is just a shortcut of the following code.
    d.init();
    d.addSource(s);
    d.start();

## run() [2/2]

template<typename GR, typename LEN, typename TR>

bool run | ( | Node | s,
|  | Node | t )

inline

This method runs the Dijkstra 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, d.run(s,t) is just a shortcut of the following code.
  d.init();
  d.addSource(s);
  d.start(t);

## path()

template<typename GR, typename LEN, typename TR>

Path path | ( | Node | t | ) | const

inline

Returns the shortest path to the given node from the root(s).

Warning
  `t` should be reached from the root(s).

Precondition
  Either run() or init() must be called before using this function.

## dist()

template<typename GR, typename LEN, typename TR>

Value dist | ( | Node | v | ) | const

inline

Returns the distance of the given node from the root(s).

Warning
  If node `v` is not reached from the root(s), then the return value of this function is undefined.

Precondition
  Either run() or init() must be called before using this function.

## predArc()

template<typename GR, typename LEN, typename TR>

Arc predArc | ( | Node | v | ) | const

inline

This function returns the 'previous arc' of the shortest path tree for the node `v`, i.e. it returns the last arc of a shortest path from a root to `v`. It is `INVALID` if `v` is not reached from the root(s) or if `v` is a root.

The shortest path tree used here is equal to the shortest path tree used in predNode() and predMap().

Precondition
  Either run() or init() must be called before using this function.

## predNode()

template<typename GR, typename LEN, typename TR>

Node predNode | ( | Node | v | ) | const

inline

This function returns the 'previous node' of the shortest path tree for the node `v`, i.e. it returns the last but one node of a shortest path from a root to `v`. It is `INVALID` if `v` is not reached from the root(s) or if `v` is a root.

The shortest path tree used here is equal to the shortest path tree used in predArc() and predMap().

Precondition
  Either run() or init() must be called before using this function.

## distMap() [2/2]

template<typename GR, typename LEN, typename TR>

const DistMap & distMap | ( |  | ) | const

inline

Returns a const reference to the node map that stores the distances of the nodes calculated by the algorithm.

Precondition
  Either run() or init() must be called before using this function.

## predMap() [2/2]

template<typename GR, typename LEN, typename TR>

const PredMap & predMap | ( |  | ) | const

inline

Returns a const reference to the node map that stores the predecessor arcs, which form the shortest path tree (forest).

Precondition
  Either run() or init() must be called before using this function.

## reached()

template<typename GR, typename LEN, typename TR>

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.

## processed()

template<typename GR, typename LEN, typename TR>

bool processed | ( | Node | v | ) | const

inline

Returns `true` if `v` is processed, i.e. the shortest path to `v` has already found.

Precondition
  Either run() or init() must be called before using this function.

## currentDist()

template<typename GR, typename LEN, typename TR>

Value currentDist | ( | Node | v | ) | const

inline

Returns the current distance of the given node from the root(s). It may be decreased in the following processes.

Precondition
  Either run() or init() must be called before using this function and node `v` must be reached but not necessarily processed.