3 *template <Graph, T, Heap=FibHeap>
7 *Dijkstra(Graph G, NodeIt s, Graph::EdgeMap<T> length)
14 * The following function should be used after run() was already run.
16 *T dist(NodeIt v) : returns the distance from s to v.
17 * It is 0 if v is not reachable from s.
19 *EdgeIt pred(NodeIt v) : returns the last edge
20 * of a shortest s-v path. Returns an invalid iterator
21 * if v=s or v is not reachable from s.
23 *bool reach(NodeIt v) : true iff v is reachable from s
34 template <typename Graph, typename T,
35 typename Heap=FibHeap<typename Graph::NodeIt, T,
36 typename Graph::NodeMap<int> > >
38 typedef typename Graph::NodeIt NodeIt;
39 typedef typename Graph::EdgeIt EdgeIt;
40 typedef typename Graph::OutEdgeIt OutEdgeIt;
44 typename Graph::NodeMap<EdgeIt> predecessor;
45 typename Graph::NodeMap<T> distance;
46 typename Graph::EdgeMap<T>& length;
47 typename Graph::NodeMap<bool> reached;
52 The distance of the nodes is 0.
54 Dijkstra(Graph& _G, NodeIt const _s,
55 typename Graph::EdgeMap<T>& _length) :
56 G(_G), s(_s), predecessor(G), distance(G),
57 length(_length), reached(G, false) { }
62 typename Graph::NodeMap<bool> scanned(G, false);
63 typename Graph::NodeMap<int> heap_map(G,-1);
70 while ( !heap.empty() ) {
73 T oldvalue=heap.get(v);
75 distance.set(v, oldvalue);
78 for( G.getFirst(e,v); G.valid(e); G.next(e)) {
81 if ( !scanned.get(w) ) {
82 if ( !reached.get(w) ) {
84 heap.push(w,oldvalue+length.get(e));
86 } else if ( oldvalue+length.get(e) < heap.get(w) ) {
88 heap.decrease(w, oldvalue+length.get(e));
98 return distance.get(v);
102 EdgeIt pred(NodeIt v) {
103 if ( v!=s ) return predecessor.get(v);
104 else return EdgeIt();
108 bool reach(NodeIt v) {
109 return reached.get(v);