71 ///It must meet the \ref concepts::ReadMap "ReadMap" concept. |
71 ///It must meet the \ref concepts::ReadMap "ReadMap" concept. |
72 typedef LM LengthMap; |
72 typedef LM LengthMap; |
73 ///The type of the length of the arcs. |
73 ///The type of the length of the arcs. |
74 typedef typename LM::Value Value; |
74 typedef typename LM::Value Value; |
75 |
75 |
76 /// Operation traits for Dijkstra algorithm. |
76 /// Operation traits for %Dijkstra algorithm. |
77 |
77 |
78 /// This class defines the operations that are used in the algorithm. |
78 /// This class defines the operations that are used in the algorithm. |
79 /// \see DijkstraDefaultOperationTraits |
79 /// \see DijkstraDefaultOperationTraits |
80 typedef DijkstraDefaultOperationTraits<Value> OperationTraits; |
80 typedef DijkstraDefaultOperationTraits<Value> OperationTraits; |
81 |
81 |
82 /// The cross reference type used by the heap. |
82 /// The cross reference type used by the heap. |
83 |
83 |
84 /// The cross reference type used by the heap. |
84 /// The cross reference type used by the heap. |
85 /// Usually it is \c Digraph::NodeMap<int>. |
85 /// Usually it is \c Digraph::NodeMap<int>. |
86 typedef typename Digraph::template NodeMap<int> HeapCrossRef; |
86 typedef typename Digraph::template NodeMap<int> HeapCrossRef; |
87 ///Instantiates a \ref HeapCrossRef. |
87 ///Instantiates a \c HeapCrossRef. |
88 |
88 |
89 ///This function instantiates a \ref HeapCrossRef. |
89 ///This function instantiates a \ref HeapCrossRef. |
90 /// \param g is the digraph, to which we would like to define the |
90 /// \param g is the digraph, to which we would like to define the |
91 /// \ref HeapCrossRef. |
91 /// \ref HeapCrossRef. |
92 static HeapCrossRef *createHeapCrossRef(const Digraph &g) |
92 static HeapCrossRef *createHeapCrossRef(const Digraph &g) |
93 { |
93 { |
94 return new HeapCrossRef(g); |
94 return new HeapCrossRef(g); |
95 } |
95 } |
96 |
96 |
97 ///The heap type used by the Dijkstra algorithm. |
97 ///The heap type used by the %Dijkstra algorithm. |
98 |
98 |
99 ///The heap type used by the Dijkstra algorithm. |
99 ///The heap type used by the Dijkstra algorithm. |
100 /// |
100 /// |
101 ///\sa BinHeap |
101 ///\sa BinHeap |
102 ///\sa Dijkstra |
102 ///\sa Dijkstra |
103 typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap; |
103 typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap; |
104 ///Instantiates a \ref Heap. |
104 ///Instantiates a \c Heap. |
105 |
105 |
106 ///This function instantiates a \ref Heap. |
106 ///This function instantiates a \ref Heap. |
107 static Heap *createHeap(HeapCrossRef& r) |
107 static Heap *createHeap(HeapCrossRef& r) |
108 { |
108 { |
109 return new Heap(r); |
109 return new Heap(r); |
114 /// |
114 /// |
115 ///The type of the map that stores the predecessor |
115 ///The type of the map that stores the predecessor |
116 ///arcs of the shortest paths. |
116 ///arcs of the shortest paths. |
117 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
117 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
118 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; |
118 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; |
119 ///Instantiates a PredMap. |
119 ///Instantiates a \c PredMap. |
120 |
120 |
121 ///This function instantiates a PredMap. |
121 ///This function instantiates a \ref PredMap. |
122 ///\param g is the digraph, to which we would like to define the |
122 ///\param g is the digraph, to which we would like to define the |
123 ///PredMap. |
123 ///\ref PredMap. |
124 static PredMap *createPredMap(const Digraph &g) |
124 static PredMap *createPredMap(const Digraph &g) |
125 { |
125 { |
126 return new PredMap(g); |
126 return new PredMap(g); |
127 } |
127 } |
128 |
128 |
130 |
130 |
131 ///The type of the map that indicates which nodes are processed. |
131 ///The type of the map that indicates which nodes are processed. |
132 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
132 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
133 ///By default it is a NullMap. |
133 ///By default it is a NullMap. |
134 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
134 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
135 ///Instantiates a ProcessedMap. |
135 ///Instantiates a \c ProcessedMap. |
136 |
136 |
137 ///This function instantiates a ProcessedMap. |
137 ///This function instantiates a \ref ProcessedMap. |
138 ///\param g is the digraph, to which |
138 ///\param g is the digraph, to which |
139 ///we would like to define the ProcessedMap |
139 ///we would like to define the \ref ProcessedMap. |
140 #ifdef DOXYGEN |
140 #ifdef DOXYGEN |
141 static ProcessedMap *createProcessedMap(const Digraph &g) |
141 static ProcessedMap *createProcessedMap(const Digraph &g) |
142 #else |
142 #else |
143 static ProcessedMap *createProcessedMap(const Digraph &) |
143 static ProcessedMap *createProcessedMap(const Digraph &) |
144 #endif |
144 #endif |
149 ///The type of the map that stores the distances of the nodes. |
149 ///The type of the map that stores the distances of the nodes. |
150 |
150 |
151 ///The type of the map that stores the distances of the nodes. |
151 ///The type of the map that stores the distances of the nodes. |
152 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
152 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
153 typedef typename Digraph::template NodeMap<typename LM::Value> DistMap; |
153 typedef typename Digraph::template NodeMap<typename LM::Value> DistMap; |
154 ///Instantiates a DistMap. |
154 ///Instantiates a \c DistMap. |
155 |
155 |
156 ///This function instantiates a DistMap. |
156 ///This function instantiates a \ref DistMap. |
157 ///\param g is the digraph, to which we would like to define |
157 ///\param g is the digraph, to which we would like to define |
158 ///the DistMap |
158 ///the \ref DistMap. |
159 static DistMap *createDistMap(const Digraph &g) |
159 static DistMap *createDistMap(const Digraph &g) |
160 { |
160 { |
161 return new DistMap(g); |
161 return new DistMap(g); |
162 } |
162 } |
163 }; |
163 }; |
214 typedef PredMapPath<Digraph, PredMap> Path; |
214 typedef PredMapPath<Digraph, PredMap> Path; |
215 ///The cross reference type used for the current heap. |
215 ///The cross reference type used for the current heap. |
216 typedef typename TR::HeapCrossRef HeapCrossRef; |
216 typedef typename TR::HeapCrossRef HeapCrossRef; |
217 ///The heap type used by the algorithm. |
217 ///The heap type used by the algorithm. |
218 typedef typename TR::Heap Heap; |
218 typedef typename TR::Heap Heap; |
219 ///The operation traits class. |
219 ///\brief The \ref DijkstraDefaultOperationTraits "operation traits class" |
|
220 ///of the algorithm. |
220 typedef typename TR::OperationTraits OperationTraits; |
221 typedef typename TR::OperationTraits OperationTraits; |
221 |
222 |
222 ///The \ref DijkstraDefaultTraits "traits class" of the algorithm. |
223 ///The \ref DijkstraDefaultTraits "traits class" of the algorithm. |
223 typedef TR Traits; |
224 typedef TR Traits; |
224 |
225 |
230 typedef typename Digraph::OutArcIt OutArcIt; |
231 typedef typename Digraph::OutArcIt OutArcIt; |
231 |
232 |
232 //Pointer to the underlying digraph. |
233 //Pointer to the underlying digraph. |
233 const Digraph *G; |
234 const Digraph *G; |
234 //Pointer to the length map. |
235 //Pointer to the length map. |
235 const LengthMap *length; |
236 const LengthMap *_length; |
236 //Pointer to the map of predecessors arcs. |
237 //Pointer to the map of predecessors arcs. |
237 PredMap *_pred; |
238 PredMap *_pred; |
238 //Indicates if _pred is locally allocated (true) or not. |
239 //Indicates if _pred is locally allocated (true) or not. |
239 bool local_pred; |
240 bool local_pred; |
240 //Pointer to the map of distances. |
241 //Pointer to the map of distances. |
295 LEMON_ASSERT(false, "PredMap is not initialized"); |
296 LEMON_ASSERT(false, "PredMap is not initialized"); |
296 return 0; // ignore warnings |
297 return 0; // ignore warnings |
297 } |
298 } |
298 }; |
299 }; |
299 ///\brief \ref named-templ-param "Named parameter" for setting |
300 ///\brief \ref named-templ-param "Named parameter" for setting |
300 ///PredMap type. |
301 ///\c PredMap type. |
301 /// |
302 /// |
302 ///\ref named-templ-param "Named parameter" for setting |
303 ///\ref named-templ-param "Named parameter" for setting |
303 ///PredMap type. |
304 ///\c PredMap type. |
304 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
305 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
305 template <class T> |
306 template <class T> |
306 struct SetPredMap |
307 struct SetPredMap |
307 : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > { |
308 : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > { |
308 typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create; |
309 typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create; |
316 LEMON_ASSERT(false, "DistMap is not initialized"); |
317 LEMON_ASSERT(false, "DistMap is not initialized"); |
317 return 0; // ignore warnings |
318 return 0; // ignore warnings |
318 } |
319 } |
319 }; |
320 }; |
320 ///\brief \ref named-templ-param "Named parameter" for setting |
321 ///\brief \ref named-templ-param "Named parameter" for setting |
321 ///DistMap type. |
322 ///\c DistMap type. |
322 /// |
323 /// |
323 ///\ref named-templ-param "Named parameter" for setting |
324 ///\ref named-templ-param "Named parameter" for setting |
324 ///DistMap type. |
325 ///\c DistMap type. |
325 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
326 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
326 template <class T> |
327 template <class T> |
327 struct SetDistMap |
328 struct SetDistMap |
328 : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > { |
329 : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > { |
329 typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create; |
330 typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create; |
337 LEMON_ASSERT(false, "ProcessedMap is not initialized"); |
338 LEMON_ASSERT(false, "ProcessedMap is not initialized"); |
338 return 0; // ignore warnings |
339 return 0; // ignore warnings |
339 } |
340 } |
340 }; |
341 }; |
341 ///\brief \ref named-templ-param "Named parameter" for setting |
342 ///\brief \ref named-templ-param "Named parameter" for setting |
342 ///ProcessedMap type. |
343 ///\c ProcessedMap type. |
343 /// |
344 /// |
344 ///\ref named-templ-param "Named parameter" for setting |
345 ///\ref named-templ-param "Named parameter" for setting |
345 ///ProcessedMap type. |
346 ///\c ProcessedMap type. |
346 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
347 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
347 template <class T> |
348 template <class T> |
348 struct SetProcessedMap |
349 struct SetProcessedMap |
349 : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > { |
350 : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > { |
350 typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create; |
351 typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create; |
356 { |
357 { |
357 return new ProcessedMap(g); |
358 return new ProcessedMap(g); |
358 } |
359 } |
359 }; |
360 }; |
360 ///\brief \ref named-templ-param "Named parameter" for setting |
361 ///\brief \ref named-templ-param "Named parameter" for setting |
361 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
362 ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
362 /// |
363 /// |
363 ///\ref named-templ-param "Named parameter" for setting |
364 ///\ref named-templ-param "Named parameter" for setting |
364 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
365 ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
365 ///If you don't set it explicitly, it will be automatically allocated. |
366 ///If you don't set it explicitly, it will be automatically allocated. |
366 struct SetStandardProcessedMap |
367 struct SetStandardProcessedMap |
367 : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > { |
368 : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > { |
368 typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > |
369 typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > |
369 Create; |
370 Create; |
437 |
438 |
438 /// \brief \ref named-templ-param "Named parameter" for setting |
439 /// \brief \ref named-templ-param "Named parameter" for setting |
439 ///\c OperationTraits type |
440 ///\c OperationTraits type |
440 /// |
441 /// |
441 ///\ref named-templ-param "Named parameter" for setting |
442 ///\ref named-templ-param "Named parameter" for setting |
442 ///\ref OperationTraits type. |
443 ///\c OperationTraits type. |
443 template <class T> |
444 template <class T> |
444 struct SetOperationTraits |
445 struct SetOperationTraits |
445 : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > { |
446 : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > { |
446 typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > |
447 typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > |
447 Create; |
448 Create; |
456 public: |
457 public: |
457 |
458 |
458 ///Constructor. |
459 ///Constructor. |
459 |
460 |
460 ///Constructor. |
461 ///Constructor. |
461 ///\param _g The digraph the algorithm runs on. |
462 ///\param g The digraph the algorithm runs on. |
462 ///\param _length The length map used by the algorithm. |
463 ///\param length The length map used by the algorithm. |
463 Dijkstra(const Digraph& _g, const LengthMap& _length) : |
464 Dijkstra(const Digraph& g, const LengthMap& length) : |
464 G(&_g), length(&_length), |
465 G(&g), _length(&length), |
465 _pred(NULL), local_pred(false), |
466 _pred(NULL), local_pred(false), |
466 _dist(NULL), local_dist(false), |
467 _dist(NULL), local_dist(false), |
467 _processed(NULL), local_processed(false), |
468 _processed(NULL), local_processed(false), |
468 _heap_cross_ref(NULL), local_heap_cross_ref(false), |
469 _heap_cross_ref(NULL), local_heap_cross_ref(false), |
469 _heap(NULL), local_heap(false) |
470 _heap(NULL), local_heap(false) |
636 |
637 |
637 for(OutArcIt e(*G,v); e!=INVALID; ++e) { |
638 for(OutArcIt e(*G,v); e!=INVALID; ++e) { |
638 Node w=G->target(e); |
639 Node w=G->target(e); |
639 switch(_heap->state(w)) { |
640 switch(_heap->state(w)) { |
640 case Heap::PRE_HEAP: |
641 case Heap::PRE_HEAP: |
641 _heap->push(w,OperationTraits::plus(oldvalue, (*length)[e])); |
642 _heap->push(w,OperationTraits::plus(oldvalue, (*_length)[e])); |
642 _pred->set(w,e); |
643 _pred->set(w,e); |
643 break; |
644 break; |
644 case Heap::IN_HEAP: |
645 case Heap::IN_HEAP: |
645 { |
646 { |
646 Value newvalue = OperationTraits::plus(oldvalue, (*length)[e]); |
647 Value newvalue = OperationTraits::plus(oldvalue, (*_length)[e]); |
647 if ( OperationTraits::less(newvalue, (*_heap)[w]) ) { |
648 if ( OperationTraits::less(newvalue, (*_heap)[w]) ) { |
648 _heap->decrease(w, newvalue); |
649 _heap->decrease(w, newvalue); |
649 _pred->set(w,e); |
650 _pred->set(w,e); |
650 } |
651 } |
651 } |
652 } |