bool map problems solved.
(now operator[] gives back 'std::vector<T>::reference' rather that 'T&')
3 *template <Graph, T, Heap=FibHeap, LengthMap=Graph::EdgeMap<T> >
7 *Dijkstra(Graph G, LengthMap length)
14 *T dist(Node v) : After run(s) was run, it returns the distance from s to v.
15 * Returns T() if v is not reachable from s.
17 *Edge pred(Node v) : After run(s) was run, it returns the last
18 * edge of a shortest s-v path. It is INVALID for s and for
19 * the nodes not reachable from s.
21 *bool reached(Node v) : After run(s) was run, it is true iff v is
26 #ifndef HUGO_DIJKSTRA_H
27 #define HUGO_DIJKSTRA_H
34 template <typename Graph, typename T,
35 typename Heap=FibHeap<typename Graph::Node, T,
36 typename Graph::NodeMap<int> >,
37 typename LengthMap=typename Graph::EdgeMap<T> >
39 typedef typename Graph::Node Node;
40 typedef typename Graph::NodeIt NodeIt;
41 typedef typename Graph::Edge Edge;
42 typedef typename Graph::OutEdgeIt OutEdgeIt;
45 const LengthMap& length;
46 typename Graph::NodeMap<Edge> predecessor;
47 typename Graph::NodeMap<T> distance;
48 typename Graph::NodeMap<bool> reach;
53 The distance of the nodes is 0.
55 Dijkstra(Graph& _G, LengthMap& _length) : G(_G),
56 length(_length), predecessor(_G), distance(_G), reach(_G) { }
62 for ( G.first(u) ; G.valid(u) ; G.next(u) ) {
63 predecessor.set(u,INVALID);
68 typename Graph::NodeMap<bool> scanned(G,false);
69 typename Graph::NodeMap<int> heap_map(G,-1);
76 while ( !heap.empty() ) {
79 T oldvalue=heap.get(v);
81 distance.set(v, oldvalue);
85 for( G.first(e,v); G.valid(e); G.next(e)) {
91 heap.push(w,oldvalue+length[e]);
93 } else if ( oldvalue+length[e] < heap.get(w) ) {
95 heap.decrease(w, oldvalue+length[e]);
109 return predecessor[v];
113 bool reached(Node v) {