lemon/dijkstra.h
author Balazs Dezso <deba@inf.elte.hu>
Tue, 25 Mar 2008 16:36:44 +0100
changeset 108 889d0c289d19
child 157 2ccc1afc2c52
permissions -rw-r--r--
Reworking assertions and moving to distinict file
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2008
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_DIJKSTRA_H
    20 #define LEMON_DIJKSTRA_H
    21 
    22 ///\ingroup shortest_path
    23 ///\file
    24 ///\brief Dijkstra algorithm.
    25 ///
    26 
    27 #include <lemon/list_digraph.h>
    28 #include <lemon/bin_heap.h>
    29 #include <lemon/bits/path_dump.h>
    30 #include <lemon/bits/invalid.h>
    31 #include <lemon/error.h>
    32 #include <lemon/maps.h>
    33 
    34 
    35 namespace lemon {
    36 
    37   /// \brief Default OperationTraits for the Dijkstra algorithm class.
    38   ///  
    39   /// It defines all computational operations and constants which are
    40   /// used in the Dijkstra algorithm.
    41   template <typename Value>
    42   struct DijkstraDefaultOperationTraits {
    43     /// \brief Gives back the zero value of the type.
    44     static Value zero() {
    45       return static_cast<Value>(0);
    46     }
    47     /// \brief Gives back the sum of the given two elements.
    48     static Value plus(const Value& left, const Value& right) {
    49       return left + right;
    50     }
    51     /// \brief Gives back true only if the first value less than the second.
    52     static bool less(const Value& left, const Value& right) {
    53       return left < right;
    54     }
    55   };
    56 
    57   /// \brief Widest path OperationTraits for the Dijkstra algorithm class.
    58   ///  
    59   /// It defines all computational operations and constants which are
    60   /// used in the Dijkstra algorithm for widest path computation.
    61   template <typename Value>
    62   struct DijkstraWidestPathOperationTraits {
    63     /// \brief Gives back the maximum value of the type.
    64     static Value zero() {
    65       return std::numeric_limits<Value>::max();
    66     }
    67     /// \brief Gives back the minimum of the given two elements.
    68     static Value plus(const Value& left, const Value& right) {
    69       return std::min(left, right);
    70     }
    71     /// \brief Gives back true only if the first value less than the second.
    72     static bool less(const Value& left, const Value& right) {
    73       return left < right;
    74     }
    75   };
    76   
    77   ///Default traits class of Dijkstra class.
    78 
    79   ///Default traits class of Dijkstra class.
    80   ///\param GR Digraph type.
    81   ///\param LM Type of length map.
    82   template<class GR, class LM>
    83   struct DijkstraDefaultTraits
    84   {
    85     ///The digraph type the algorithm runs on. 
    86     typedef GR Digraph;
    87     ///The type of the map that stores the arc lengths.
    88 
    89     ///The type of the map that stores the arc lengths.
    90     ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
    91     typedef LM LengthMap;
    92     //The type of the length of the arcs.
    93     typedef typename LM::Value Value;
    94     /// Operation traits for Dijkstra algorithm.
    95 
    96     /// It defines the used operation by the algorithm.
    97     /// \see DijkstraDefaultOperationTraits
    98     typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
    99     /// The cross reference type used by heap.
   100 
   101 
   102     /// The cross reference type used by heap.
   103     /// Usually it is \c Digraph::NodeMap<int>.
   104     typedef typename Digraph::template NodeMap<int> HeapCrossRef;
   105     ///Instantiates a HeapCrossRef.
   106 
   107     ///This function instantiates a \c HeapCrossRef. 
   108     /// \param G is the digraph, to which we would like to define the 
   109     /// HeapCrossRef.
   110     static HeapCrossRef *createHeapCrossRef(const GR &G) 
   111     {
   112       return new HeapCrossRef(G);
   113     }
   114     
   115     ///The heap type used by Dijkstra algorithm.
   116 
   117     ///The heap type used by Dijkstra algorithm.
   118     ///
   119     ///\sa BinHeap
   120     ///\sa Dijkstra
   121     typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap;
   122 
   123     static Heap *createHeap(HeapCrossRef& R) 
   124     {
   125       return new Heap(R);
   126     }
   127 
   128     ///\brief The type of the map that stores the last
   129     ///arcs of the shortest paths.
   130     /// 
   131     ///The type of the map that stores the last
   132     ///arcs of the shortest paths.
   133     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   134     ///
   135     typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
   136     ///Instantiates a PredMap.
   137  
   138     ///This function instantiates a \c PredMap. 
   139     ///\param G is the digraph, to which we would like to define the PredMap.
   140     ///\todo The digraph alone may be insufficient for the initialization
   141     static PredMap *createPredMap(const GR &G) 
   142     {
   143       return new PredMap(G);
   144     }
   145 
   146     ///The type of the map that stores whether a nodes is processed.
   147  
   148     ///The type of the map that stores whether a nodes is processed.
   149     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   150     ///By default it is a NullMap.
   151     ///\todo If it is set to a real map,
   152     ///Dijkstra::processed() should read this.
   153     ///\todo named parameter to set this type, function to read and write.
   154     typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
   155     ///Instantiates a ProcessedMap.
   156  
   157     ///This function instantiates a \c ProcessedMap. 
   158     ///\param g is the digraph, to which
   159     ///we would like to define the \c ProcessedMap
   160 #ifdef DOXYGEN
   161     static ProcessedMap *createProcessedMap(const GR &g)
   162 #else
   163     static ProcessedMap *createProcessedMap(const GR &)
   164 #endif
   165     {
   166       return new ProcessedMap();
   167     }
   168     ///The type of the map that stores the dists of the nodes.
   169  
   170     ///The type of the map that stores the dists of the nodes.
   171     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   172     ///
   173     typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
   174     ///Instantiates a DistMap.
   175  
   176     ///This function instantiates a \ref DistMap. 
   177     ///\param G is the digraph, to which we would like to define the \ref DistMap
   178     static DistMap *createDistMap(const GR &G)
   179     {
   180       return new DistMap(G);
   181     }
   182   };
   183   
   184   ///%Dijkstra algorithm class.
   185   
   186   /// \ingroup shortest_path
   187   ///This class provides an efficient implementation of %Dijkstra algorithm.
   188   ///The arc lengths are passed to the algorithm using a
   189   ///\ref concepts::ReadMap "ReadMap",
   190   ///so it is easy to change it to any kind of length.
   191   ///
   192   ///The type of the length is determined by the
   193   ///\ref concepts::ReadMap::Value "Value" of the length map.
   194   ///
   195   ///It is also possible to change the underlying priority heap.
   196   ///
   197   ///\param GR The digraph type the algorithm runs on. The default value
   198   ///is \ref ListDigraph. The value of GR is not used directly by
   199   ///Dijkstra, it is only passed to \ref DijkstraDefaultTraits.
   200   ///\param LM This read-only ArcMap determines the lengths of the
   201   ///arcs. It is read once for each arc, so the map may involve in
   202   ///relatively time consuming process to compute the arc length if
   203   ///it is necessary. The default map type is \ref
   204   ///concepts::Digraph::ArcMap "Digraph::ArcMap<int>".  The value
   205   ///of LM is not used directly by Dijkstra, it is only passed to \ref
   206   ///DijkstraDefaultTraits.  \param TR Traits class to set
   207   ///various data types used by the algorithm.  The default traits
   208   ///class is \ref DijkstraDefaultTraits
   209   ///"DijkstraDefaultTraits<GR,LM>".  See \ref
   210   ///DijkstraDefaultTraits for the documentation of a Dijkstra traits
   211   ///class.
   212   ///
   213   ///\author Jacint Szabo and Alpar Juttner
   214 
   215 #ifdef DOXYGEN
   216   template <typename GR, typename LM, typename TR>
   217 #else
   218   template <typename GR=ListDigraph,
   219 	    typename LM=typename GR::template ArcMap<int>,
   220 	    typename TR=DijkstraDefaultTraits<GR,LM> >
   221 #endif
   222   class Dijkstra {
   223   public:
   224     /**
   225      * \brief \ref Exception for uninitialized parameters.
   226      *
   227      * This error represents problems in the initialization
   228      * of the parameters of the algorithms.
   229      */
   230     class UninitializedParameter : public lemon::UninitializedParameter {
   231     public:
   232       virtual const char* what() const throw() {
   233 	return "lemon::Dijkstra::UninitializedParameter";
   234       }
   235     };
   236 
   237     typedef TR Traits;
   238     ///The type of the underlying digraph.
   239     typedef typename TR::Digraph Digraph;
   240     ///\e
   241     typedef typename Digraph::Node Node;
   242     ///\e
   243     typedef typename Digraph::NodeIt NodeIt;
   244     ///\e
   245     typedef typename Digraph::Arc Arc;
   246     ///\e
   247     typedef typename Digraph::OutArcIt OutArcIt;
   248     
   249     ///The type of the length of the arcs.
   250     typedef typename TR::LengthMap::Value Value;
   251     ///The type of the map that stores the arc lengths.
   252     typedef typename TR::LengthMap LengthMap;
   253     ///\brief The type of the map that stores the last
   254     ///arcs of the shortest paths.
   255     typedef typename TR::PredMap PredMap;
   256     ///The type of the map indicating if a node is processed.
   257     typedef typename TR::ProcessedMap ProcessedMap;
   258     ///The type of the map that stores the dists of the nodes.
   259     typedef typename TR::DistMap DistMap;
   260     ///The cross reference type used for the current heap.
   261     typedef typename TR::HeapCrossRef HeapCrossRef;
   262     ///The heap type used by the dijkstra algorithm.
   263     typedef typename TR::Heap Heap;
   264     ///The operation traits.
   265     typedef typename TR::OperationTraits OperationTraits;
   266   private:
   267     /// Pointer to the underlying digraph.
   268     const Digraph *G;
   269     /// Pointer to the length map
   270     const LengthMap *length;
   271     ///Pointer to the map of predecessors arcs.
   272     PredMap *_pred;
   273     ///Indicates if \ref _pred is locally allocated (\c true) or not.
   274     bool local_pred;
   275     ///Pointer to the map of distances.
   276     DistMap *_dist;
   277     ///Indicates if \ref _dist is locally allocated (\c true) or not.
   278     bool local_dist;
   279     ///Pointer to the map of processed status of the nodes.
   280     ProcessedMap *_processed;
   281     ///Indicates if \ref _processed is locally allocated (\c true) or not.
   282     bool local_processed;
   283     ///Pointer to the heap cross references.
   284     HeapCrossRef *_heap_cross_ref;
   285     ///Indicates if \ref _heap_cross_ref is locally allocated (\c true) or not.
   286     bool local_heap_cross_ref;
   287     ///Pointer to the heap.
   288     Heap *_heap;
   289     ///Indicates if \ref _heap is locally allocated (\c true) or not.
   290     bool local_heap;
   291 
   292     ///Creates the maps if necessary.
   293     
   294     ///\todo Better memory allocation (instead of new).
   295     void create_maps() 
   296     {
   297       if(!_pred) {
   298 	local_pred = true;
   299 	_pred = Traits::createPredMap(*G);
   300       }
   301       if(!_dist) {
   302 	local_dist = true;
   303 	_dist = Traits::createDistMap(*G);
   304       }
   305       if(!_processed) {
   306 	local_processed = true;
   307 	_processed = Traits::createProcessedMap(*G);
   308       }
   309       if (!_heap_cross_ref) {
   310 	local_heap_cross_ref = true;
   311 	_heap_cross_ref = Traits::createHeapCrossRef(*G);
   312       }
   313       if (!_heap) {
   314 	local_heap = true;
   315 	_heap = Traits::createHeap(*_heap_cross_ref);
   316       }
   317     }
   318     
   319   public :
   320 
   321     typedef Dijkstra Create;
   322  
   323     ///\name Named template parameters
   324 
   325     ///@{
   326 
   327     template <class T>
   328     struct DefPredMapTraits : public Traits {
   329       typedef T PredMap;
   330       static PredMap *createPredMap(const Digraph &)
   331       {
   332 	throw UninitializedParameter();
   333       }
   334     };
   335     ///\ref named-templ-param "Named parameter" for setting PredMap type
   336 
   337     ///\ref named-templ-param "Named parameter" for setting PredMap type
   338     ///
   339     template <class T>
   340     struct DefPredMap 
   341       : public Dijkstra< Digraph,	LengthMap, DefPredMapTraits<T> > {
   342       typedef Dijkstra< Digraph,	LengthMap, DefPredMapTraits<T> > Create;
   343     };
   344     
   345     template <class T>
   346     struct DefDistMapTraits : public Traits {
   347       typedef T DistMap;
   348       static DistMap *createDistMap(const Digraph &)
   349       {
   350 	throw UninitializedParameter();
   351       }
   352     };
   353     ///\ref named-templ-param "Named parameter" for setting DistMap type
   354 
   355     ///\ref named-templ-param "Named parameter" for setting DistMap type
   356     ///
   357     template <class T>
   358     struct DefDistMap 
   359       : public Dijkstra< Digraph, LengthMap, DefDistMapTraits<T> > { 
   360       typedef Dijkstra< Digraph, LengthMap, DefDistMapTraits<T> > Create;
   361     };
   362     
   363     template <class T>
   364     struct DefProcessedMapTraits : public Traits {
   365       typedef T ProcessedMap;
   366       static ProcessedMap *createProcessedMap(const Digraph &G) 
   367       {
   368 	throw UninitializedParameter();
   369       }
   370     };
   371     ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
   372 
   373     ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
   374     ///
   375     template <class T>
   376     struct DefProcessedMap 
   377       : public Dijkstra< Digraph,	LengthMap, DefProcessedMapTraits<T> > { 
   378       typedef Dijkstra< Digraph,	LengthMap, DefProcessedMapTraits<T> > Create;
   379     };
   380     
   381     struct DefDigraphProcessedMapTraits : public Traits {
   382       typedef typename Digraph::template NodeMap<bool> ProcessedMap;
   383       static ProcessedMap *createProcessedMap(const Digraph &G) 
   384       {
   385 	return new ProcessedMap(G);
   386       }
   387     };
   388     ///\brief \ref named-templ-param "Named parameter"
   389     ///for setting the ProcessedMap type to be Digraph::NodeMap<bool>.
   390     ///
   391     ///\ref named-templ-param "Named parameter"
   392     ///for setting the ProcessedMap type to be Digraph::NodeMap<bool>.
   393     ///If you don't set it explicitely, it will be automatically allocated.
   394     template <class T>
   395     struct DefProcessedMapToBeDefaultMap 
   396       : public Dijkstra< Digraph, LengthMap, DefDigraphProcessedMapTraits> {
   397       typedef Dijkstra< Digraph, LengthMap, DefDigraphProcessedMapTraits> Create;
   398     };
   399 
   400     template <class H, class CR>
   401     struct DefHeapTraits : public Traits {
   402       typedef CR HeapCrossRef;
   403       typedef H Heap;
   404       static HeapCrossRef *createHeapCrossRef(const Digraph &) {
   405 	throw UninitializedParameter();
   406       }
   407       static Heap *createHeap(HeapCrossRef &) 
   408       {
   409 	throw UninitializedParameter();
   410       }
   411     };
   412     ///\brief \ref named-templ-param "Named parameter" for setting
   413     ///heap and cross reference type
   414     ///
   415     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   416     ///reference type
   417     ///
   418     template <class H, class CR = typename Digraph::template NodeMap<int> >
   419     struct DefHeap
   420       : public Dijkstra< Digraph,	LengthMap, DefHeapTraits<H, CR> > { 
   421       typedef Dijkstra< Digraph,	LengthMap, DefHeapTraits<H, CR> > Create;
   422     };
   423 
   424     template <class H, class CR>
   425     struct DefStandardHeapTraits : public Traits {
   426       typedef CR HeapCrossRef;
   427       typedef H Heap;
   428       static HeapCrossRef *createHeapCrossRef(const Digraph &G) {
   429 	return new HeapCrossRef(G);
   430       }
   431       static Heap *createHeap(HeapCrossRef &R) 
   432       {
   433 	return new Heap(R);
   434       }
   435     };
   436     ///\brief \ref named-templ-param "Named parameter" for setting
   437     ///heap and cross reference type with automatic allocation
   438     ///
   439     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   440     ///reference type. It can allocate the heap and the cross reference 
   441     ///object if the cross reference's constructor waits for the digraph as 
   442     ///parameter and the heap's constructor waits for the cross reference.
   443     template <class H, class CR = typename Digraph::template NodeMap<int> >
   444     struct DefStandardHeap
   445       : public Dijkstra< Digraph,	LengthMap, DefStandardHeapTraits<H, CR> > { 
   446       typedef Dijkstra< Digraph,	LengthMap, DefStandardHeapTraits<H, CR> > 
   447       Create;
   448     };
   449 
   450     template <class T>
   451     struct DefOperationTraitsTraits : public Traits {
   452       typedef T OperationTraits;
   453     };
   454     
   455     /// \brief \ref named-templ-param "Named parameter" for setting 
   456     /// OperationTraits type
   457     ///
   458     /// \ref named-templ-param "Named parameter" for setting OperationTraits
   459     /// type
   460     template <class T>
   461     struct DefOperationTraits
   462       : public Dijkstra<Digraph, LengthMap, DefOperationTraitsTraits<T> > {
   463       typedef Dijkstra<Digraph, LengthMap, DefOperationTraitsTraits<T> >
   464       Create;
   465     };
   466     
   467     ///@}
   468 
   469 
   470   protected:
   471 
   472     Dijkstra() {}
   473 
   474   public:      
   475     
   476     ///Constructor.
   477     
   478     ///\param _G the digraph the algorithm will run on.
   479     ///\param _length the length map used by the algorithm.
   480     Dijkstra(const Digraph& _G, const LengthMap& _length) :
   481       G(&_G), length(&_length),
   482       _pred(NULL), local_pred(false),
   483       _dist(NULL), local_dist(false),
   484       _processed(NULL), local_processed(false),
   485       _heap_cross_ref(NULL), local_heap_cross_ref(false),
   486       _heap(NULL), local_heap(false)
   487     { }
   488     
   489     ///Destructor.
   490     ~Dijkstra() 
   491     {
   492       if(local_pred) delete _pred;
   493       if(local_dist) delete _dist;
   494       if(local_processed) delete _processed;
   495       if(local_heap_cross_ref) delete _heap_cross_ref;
   496       if(local_heap) delete _heap;
   497     }
   498 
   499     ///Sets the length map.
   500 
   501     ///Sets the length map.
   502     ///\return <tt> (*this) </tt>
   503     Dijkstra &lengthMap(const LengthMap &m) 
   504     {
   505       length = &m;
   506       return *this;
   507     }
   508 
   509     ///Sets the map storing the predecessor arcs.
   510 
   511     ///Sets the map storing the predecessor arcs.
   512     ///If you don't use this function before calling \ref run(),
   513     ///it will allocate one. The destuctor deallocates this
   514     ///automatically allocated map, of course.
   515     ///\return <tt> (*this) </tt>
   516     Dijkstra &predMap(PredMap &m) 
   517     {
   518       if(local_pred) {
   519 	delete _pred;
   520 	local_pred=false;
   521       }
   522       _pred = &m;
   523       return *this;
   524     }
   525 
   526     ///Sets the map storing the distances calculated by the algorithm.
   527 
   528     ///Sets the map storing the distances calculated by the algorithm.
   529     ///If you don't use this function before calling \ref run(),
   530     ///it will allocate one. The destuctor deallocates this
   531     ///automatically allocated map, of course.
   532     ///\return <tt> (*this) </tt>
   533     Dijkstra &distMap(DistMap &m) 
   534     {
   535       if(local_dist) {
   536 	delete _dist;
   537 	local_dist=false;
   538       }
   539       _dist = &m;
   540       return *this;
   541     }
   542 
   543     ///Sets the heap and the cross reference used by algorithm.
   544 
   545     ///Sets the heap and the cross reference used by algorithm.
   546     ///If you don't use this function before calling \ref run(),
   547     ///it will allocate one. The destuctor deallocates this
   548     ///automatically allocated heap and cross reference, of course.
   549     ///\return <tt> (*this) </tt>
   550     Dijkstra &heap(Heap& hp, HeapCrossRef &cr)
   551     {
   552       if(local_heap_cross_ref) {
   553 	delete _heap_cross_ref;
   554 	local_heap_cross_ref=false;
   555       }
   556       _heap_cross_ref = &cr;
   557       if(local_heap) {
   558 	delete _heap;
   559 	local_heap=false;
   560       }
   561       _heap = &hp;
   562       return *this;
   563     }
   564 
   565   private:
   566     void finalizeNodeData(Node v,Value dst)
   567     {
   568       _processed->set(v,true);
   569       _dist->set(v, dst);
   570     }
   571 
   572   public:
   573 
   574     typedef PredMapPath<Digraph, PredMap> Path;
   575 
   576     ///\name Execution control
   577     ///The simplest way to execute the algorithm is to use
   578     ///one of the member functions called \c run(...).
   579     ///\n
   580     ///If you need more control on the execution,
   581     ///first you must call \ref init(), then you can add several source nodes
   582     ///with \ref addSource().
   583     ///Finally \ref start() will perform the actual path
   584     ///computation.
   585 
   586     ///@{
   587 
   588     ///Initializes the internal data structures.
   589 
   590     ///Initializes the internal data structures.
   591     ///
   592     void init()
   593     {
   594       create_maps();
   595       _heap->clear();
   596       for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
   597 	_pred->set(u,INVALID);
   598 	_processed->set(u,false);
   599 	_heap_cross_ref->set(u,Heap::PRE_HEAP);
   600       }
   601     }
   602     
   603     ///Adds a new source node.
   604 
   605     ///Adds a new source node to the priority heap.
   606     ///
   607     ///The optional second parameter is the initial distance of the node.
   608     ///
   609     ///It checks if the node has already been added to the heap and
   610     ///it is pushed to the heap only if either it was not in the heap
   611     ///or the shortest path found till then is shorter than \c dst.
   612     void addSource(Node s,Value dst=OperationTraits::zero())
   613     {
   614       if(_heap->state(s) != Heap::IN_HEAP) {
   615 	_heap->push(s,dst);
   616       } else if(OperationTraits::less((*_heap)[s], dst)) {
   617 	_heap->set(s,dst);
   618 	_pred->set(s,INVALID);
   619       }
   620     }
   621     
   622     ///Processes the next node in the priority heap
   623 
   624     ///Processes the next node in the priority heap.
   625     ///
   626     ///\return The processed node.
   627     ///
   628     ///\warning The priority heap must not be empty!
   629     Node processNextNode()
   630     {
   631       Node v=_heap->top(); 
   632       Value oldvalue=_heap->prio();
   633       _heap->pop();
   634       finalizeNodeData(v,oldvalue);
   635       
   636       for(OutArcIt e(*G,v); e!=INVALID; ++e) {
   637 	Node w=G->target(e); 
   638 	switch(_heap->state(w)) {
   639 	case Heap::PRE_HEAP:
   640 	  _heap->push(w,OperationTraits::plus(oldvalue, (*length)[e])); 
   641 	  _pred->set(w,e);
   642 	  break;
   643 	case Heap::IN_HEAP:
   644 	  {
   645 	    Value newvalue = OperationTraits::plus(oldvalue, (*length)[e]);
   646 	    if ( OperationTraits::less(newvalue, (*_heap)[w]) ) {
   647 	      _heap->decrease(w, newvalue); 
   648 	      _pred->set(w,e);
   649 	    }
   650 	  }
   651 	  break;
   652 	case Heap::POST_HEAP:
   653 	  break;
   654 	}
   655       }
   656       return v;
   657     }
   658 
   659     ///Next node to be processed.
   660     
   661     ///Next node to be processed.
   662     ///
   663     ///\return The next node to be processed or INVALID if the priority heap
   664     /// is empty.
   665     Node nextNode()
   666     { 
   667       return !_heap->empty()?_heap->top():INVALID;
   668     }
   669  
   670     ///\brief Returns \c false if there are nodes
   671     ///to be processed in the priority heap
   672     ///
   673     ///Returns \c false if there are nodes
   674     ///to be processed in the priority heap
   675     bool emptyQueue() { return _heap->empty(); }
   676     ///Returns the number of the nodes to be processed in the priority heap
   677 
   678     ///Returns the number of the nodes to be processed in the priority heap
   679     ///
   680     int queueSize() { return _heap->size(); }
   681     
   682     ///Executes the algorithm.
   683 
   684     ///Executes the algorithm.
   685     ///
   686     ///\pre init() must be called and at least one node should be added
   687     ///with addSource() before using this function.
   688     ///
   689     ///This method runs the %Dijkstra algorithm from the root node(s)
   690     ///in order to
   691     ///compute the
   692     ///shortest path to each node. The algorithm computes
   693     ///- The shortest path tree.
   694     ///- The distance of each node from the root(s).
   695     ///
   696     void start()
   697     {
   698       while ( !_heap->empty() ) processNextNode();
   699     }
   700     
   701     ///Executes the algorithm until \c dest is reached.
   702 
   703     ///Executes the algorithm until \c dest is reached.
   704     ///
   705     ///\pre init() must be called and at least one node should be added
   706     ///with addSource() before using this function.
   707     ///
   708     ///This method runs the %Dijkstra algorithm from the root node(s)
   709     ///in order to
   710     ///compute the
   711     ///shortest path to \c dest. The algorithm computes
   712     ///- The shortest path to \c  dest.
   713     ///- The distance of \c dest from the root(s).
   714     ///
   715     void start(Node dest)
   716     {
   717       while ( !_heap->empty() && _heap->top()!=dest ) processNextNode();
   718       if ( !_heap->empty() ) finalizeNodeData(_heap->top(),_heap->prio());
   719     }
   720     
   721     ///Executes the algorithm until a condition is met.
   722 
   723     ///Executes the algorithm until a condition is met.
   724     ///
   725     ///\pre init() must be called and at least one node should be added
   726     ///with addSource() before using this function.
   727     ///
   728     ///\param nm must be a bool (or convertible) node map. The algorithm
   729     ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
   730     ///
   731     ///\return The reached node \c v with <tt>nm[v]</tt> true or
   732     ///\c INVALID if no such node was found.
   733     template<class NodeBoolMap>
   734     Node start(const NodeBoolMap &nm)
   735     {
   736       while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
   737       if ( _heap->empty() ) return INVALID;
   738       finalizeNodeData(_heap->top(),_heap->prio());
   739       return _heap->top();
   740     }
   741     
   742     ///Runs %Dijkstra algorithm from node \c s.
   743     
   744     ///This method runs the %Dijkstra algorithm from a root node \c s
   745     ///in order to
   746     ///compute the
   747     ///shortest path to each node. The algorithm computes
   748     ///- The shortest path tree.
   749     ///- The distance of each node from the root.
   750     ///
   751     ///\note d.run(s) is just a shortcut of the following code.
   752     ///\code
   753     ///  d.init();
   754     ///  d.addSource(s);
   755     ///  d.start();
   756     ///\endcode
   757     void run(Node s) {
   758       init();
   759       addSource(s);
   760       start();
   761     }
   762     
   763     ///Finds the shortest path between \c s and \c t.
   764     
   765     ///Finds the shortest path between \c s and \c t.
   766     ///
   767     ///\return The length of the shortest s---t path if there exists one,
   768     ///0 otherwise.
   769     ///\note Apart from the return value, d.run(s) is
   770     ///just a shortcut of the following code.
   771     ///\code
   772     ///  d.init();
   773     ///  d.addSource(s);
   774     ///  d.start(t);
   775     ///\endcode
   776     Value run(Node s,Node t) {
   777       init();
   778       addSource(s);
   779       start(t);
   780       return (*_pred)[t]==INVALID?OperationTraits::zero():(*_dist)[t];
   781     }
   782     
   783     ///@}
   784 
   785     ///\name Query Functions
   786     ///The result of the %Dijkstra algorithm can be obtained using these
   787     ///functions.\n
   788     ///Before the use of these functions,
   789     ///either run() or start() must be called.
   790     
   791     ///@{
   792 
   793     ///Gives back the shortest path.
   794     
   795     ///Gives back the shortest path.
   796     ///\pre The \c t should be reachable from the source.
   797     Path path(Node t) 
   798     {
   799       return Path(*G, *_pred, t);
   800     }
   801 
   802     ///The distance of a node from the root.
   803 
   804     ///Returns the distance of a node from the root.
   805     ///\pre \ref run() must be called before using this function.
   806     ///\warning If node \c v in unreachable from the root the return value
   807     ///of this funcion is undefined.
   808     Value dist(Node v) const { return (*_dist)[v]; }
   809 
   810     ///The current distance of a node from the root.
   811 
   812     ///Returns the current distance of a node from the root.
   813     ///It may be decreased in the following processes.
   814     ///\pre \c node should be reached but not processed
   815     Value currentDist(Node v) const { return (*_heap)[v]; }
   816 
   817     ///Returns the 'previous arc' of the shortest path tree.
   818 
   819     ///For a node \c v it returns the 'previous arc' of the shortest path tree,
   820     ///i.e. it returns the last arc of a shortest path from the root to \c
   821     ///v. It is \ref INVALID
   822     ///if \c v is unreachable from the root or if \c v=s. The
   823     ///shortest path tree used here is equal to the shortest path tree used in
   824     ///\ref predNode().  \pre \ref run() must be called before using
   825     ///this function.
   826     Arc predArc(Node v) const { return (*_pred)[v]; }
   827 
   828     ///Returns the 'previous node' of the shortest path tree.
   829 
   830     ///For a node \c v it returns the 'previous node' of the shortest path tree,
   831     ///i.e. it returns the last but one node from a shortest path from the
   832     ///root to \c /v. It is INVALID if \c v is unreachable from the root or if
   833     ///\c v=s. The shortest path tree used here is equal to the shortest path
   834     ///tree used in \ref predArc().  \pre \ref run() must be called before
   835     ///using this function.
   836     Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
   837 				  G->source((*_pred)[v]); }
   838     
   839     ///Returns a reference to the NodeMap of distances.
   840 
   841     ///Returns a reference to the NodeMap of distances. \pre \ref run() must
   842     ///be called before using this function.
   843     const DistMap &distMap() const { return *_dist;}
   844  
   845     ///Returns a reference to the shortest path tree map.
   846 
   847     ///Returns a reference to the NodeMap of the arcs of the
   848     ///shortest path tree.
   849     ///\pre \ref run() must be called before using this function.
   850     const PredMap &predMap() const { return *_pred;}
   851  
   852     ///Checks if a node is reachable from the root.
   853 
   854     ///Returns \c true if \c v is reachable from the root.
   855     ///\warning The source nodes are inditated as unreached.
   856     ///\pre \ref run() must be called before using this function.
   857     ///
   858     bool reached(Node v) { return (*_heap_cross_ref)[v] != Heap::PRE_HEAP; }
   859 
   860     ///Checks if a node is processed.
   861 
   862     ///Returns \c true if \c v is processed, i.e. the shortest
   863     ///path to \c v has already found.
   864     ///\pre \ref run() must be called before using this function.
   865     ///
   866     bool processed(Node v) { return (*_heap_cross_ref)[v] == Heap::POST_HEAP; }
   867     
   868     ///@}
   869   };
   870 
   871 
   872 
   873 
   874  
   875   ///Default traits class of Dijkstra function.
   876 
   877   ///Default traits class of Dijkstra function.
   878   ///\param GR Digraph type.
   879   ///\param LM Type of length map.
   880   template<class GR, class LM>
   881   struct DijkstraWizardDefaultTraits
   882   {
   883     ///The digraph type the algorithm runs on. 
   884     typedef GR Digraph;
   885     ///The type of the map that stores the arc lengths.
   886 
   887     ///The type of the map that stores the arc lengths.
   888     ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
   889     typedef LM LengthMap;
   890     //The type of the length of the arcs.
   891     typedef typename LM::Value Value;
   892     /// Operation traits for Dijkstra algorithm.
   893 
   894     /// It defines the used operation by the algorithm.
   895     /// \see DijkstraDefaultOperationTraits
   896     typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
   897     ///The heap type used by Dijkstra algorithm.
   898 
   899     /// The cross reference type used by heap.
   900 
   901     /// The cross reference type used by heap.
   902     /// Usually it is \c Digraph::NodeMap<int>.
   903     typedef typename Digraph::template NodeMap<int> HeapCrossRef;
   904     ///Instantiates a HeapCrossRef.
   905 
   906     ///This function instantiates a \ref HeapCrossRef. 
   907     /// \param G is the digraph, to which we would like to define the 
   908     /// HeapCrossRef.
   909     /// \todo The digraph alone may be insufficient for the initialization
   910     static HeapCrossRef *createHeapCrossRef(const GR &G) 
   911     {
   912       return new HeapCrossRef(G);
   913     }
   914     
   915     ///The heap type used by Dijkstra algorithm.
   916 
   917     ///The heap type used by Dijkstra algorithm.
   918     ///
   919     ///\sa BinHeap
   920     ///\sa Dijkstra
   921     typedef BinHeap<typename LM::Value, typename GR::template NodeMap<int>,
   922 		    std::less<Value> > Heap;
   923 
   924     static Heap *createHeap(HeapCrossRef& R) 
   925     {
   926       return new Heap(R);
   927     }
   928 
   929     ///\brief The type of the map that stores the last
   930     ///arcs of the shortest paths.
   931     /// 
   932     ///The type of the map that stores the last
   933     ///arcs of the shortest paths.
   934     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   935     ///
   936     typedef NullMap <typename GR::Node,typename GR::Arc> PredMap;
   937     ///Instantiates a PredMap.
   938  
   939     ///This function instantiates a \ref PredMap. 
   940     ///\param g is the digraph, to which we would like to define the PredMap.
   941     ///\todo The digraph alone may be insufficient for the initialization
   942 #ifdef DOXYGEN
   943     static PredMap *createPredMap(const GR &g) 
   944 #else
   945     static PredMap *createPredMap(const GR &) 
   946 #endif
   947     {
   948       return new PredMap();
   949     }
   950     ///The type of the map that stores whether a nodes is processed.
   951  
   952     ///The type of the map that stores whether a nodes is processed.
   953     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   954     ///By default it is a NullMap.
   955     ///\todo If it is set to a real map,
   956     ///Dijkstra::processed() should read this.
   957     ///\todo named parameter to set this type, function to read and write.
   958     typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
   959     ///Instantiates a ProcessedMap.
   960  
   961     ///This function instantiates a \ref ProcessedMap. 
   962     ///\param g is the digraph, to which
   963     ///we would like to define the \ref ProcessedMap
   964 #ifdef DOXYGEN
   965     static ProcessedMap *createProcessedMap(const GR &g)
   966 #else
   967     static ProcessedMap *createProcessedMap(const GR &)
   968 #endif
   969     {
   970       return new ProcessedMap();
   971     }
   972     ///The type of the map that stores the dists of the nodes.
   973  
   974     ///The type of the map that stores the dists of the nodes.
   975     ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
   976     ///
   977     typedef NullMap<typename Digraph::Node,typename LM::Value> DistMap;
   978     ///Instantiates a DistMap.
   979  
   980     ///This function instantiates a \ref DistMap. 
   981     ///\param g is the digraph, to which we would like to define the \ref DistMap
   982 #ifdef DOXYGEN
   983     static DistMap *createDistMap(const GR &g)
   984 #else
   985     static DistMap *createDistMap(const GR &)
   986 #endif
   987     {
   988       return new DistMap();
   989     }
   990   };
   991   
   992   /// Default traits used by \ref DijkstraWizard
   993 
   994   /// To make it easier to use Dijkstra algorithm
   995   ///we have created a wizard class.
   996   /// This \ref DijkstraWizard class needs default traits,
   997   ///as well as the \ref Dijkstra class.
   998   /// The \ref DijkstraWizardBase is a class to be the default traits of the
   999   /// \ref DijkstraWizard class.
  1000   /// \todo More named parameters are required...
  1001   template<class GR,class LM>
  1002   class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LM>
  1003   {
  1004 
  1005     typedef DijkstraWizardDefaultTraits<GR,LM> Base;
  1006   protected:
  1007     /// Type of the nodes in the digraph.
  1008     typedef typename Base::Digraph::Node Node;
  1009 
  1010     /// Pointer to the underlying digraph.
  1011     void *_g;
  1012     /// Pointer to the length map
  1013     void *_length;
  1014     ///Pointer to the map of predecessors arcs.
  1015     void *_pred;
  1016     ///Pointer to the map of distances.
  1017     void *_dist;
  1018     ///Pointer to the source node.
  1019     Node _source;
  1020 
  1021     public:
  1022     /// Constructor.
  1023     
  1024     /// This constructor does not require parameters, therefore it initiates
  1025     /// all of the attributes to default values (0, INVALID).
  1026     DijkstraWizardBase() : _g(0), _length(0), _pred(0),
  1027 			   _dist(0), _source(INVALID) {}
  1028 
  1029     /// Constructor.
  1030     
  1031     /// This constructor requires some parameters,
  1032     /// listed in the parameters list.
  1033     /// Others are initiated to 0.
  1034     /// \param g is the initial value of  \ref _g
  1035     /// \param l is the initial value of  \ref _length
  1036     /// \param s is the initial value of  \ref _source
  1037     DijkstraWizardBase(const GR &g,const LM &l, Node s=INVALID) :
  1038       _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 
  1039       _length(reinterpret_cast<void*>(const_cast<LM*>(&l))), 
  1040       _pred(0), _dist(0), _source(s) {}
  1041 
  1042   };
  1043   
  1044   /// A class to make the usage of Dijkstra algorithm easier
  1045 
  1046   /// This class is created to make it easier to use Dijkstra algorithm.
  1047   /// It uses the functions and features of the plain \ref Dijkstra,
  1048   /// but it is much simpler to use it.
  1049   ///
  1050   /// Simplicity means that the way to change the types defined
  1051   /// in the traits class is based on functions that returns the new class
  1052   /// and not on templatable built-in classes.
  1053   /// When using the plain \ref Dijkstra
  1054   /// the new class with the modified type comes from
  1055   /// the original class by using the ::
  1056   /// operator. In the case of \ref DijkstraWizard only
  1057   /// a function have to be called and it will
  1058   /// return the needed class.
  1059   ///
  1060   /// It does not have own \ref run method. When its \ref run method is called
  1061   /// it initiates a plain \ref Dijkstra class, and calls the \ref 
  1062   /// Dijkstra::run method of it.
  1063   template<class TR>
  1064   class DijkstraWizard : public TR
  1065   {
  1066     typedef TR Base;
  1067 
  1068     ///The type of the underlying digraph.
  1069     typedef typename TR::Digraph Digraph;
  1070     //\e
  1071     typedef typename Digraph::Node Node;
  1072     //\e
  1073     typedef typename Digraph::NodeIt NodeIt;
  1074     //\e
  1075     typedef typename Digraph::Arc Arc;
  1076     //\e
  1077     typedef typename Digraph::OutArcIt OutArcIt;
  1078     
  1079     ///The type of the map that stores the arc lengths.
  1080     typedef typename TR::LengthMap LengthMap;
  1081     ///The type of the length of the arcs.
  1082     typedef typename LengthMap::Value Value;
  1083     ///\brief The type of the map that stores the last
  1084     ///arcs of the shortest paths.
  1085     typedef typename TR::PredMap PredMap;
  1086     ///The type of the map that stores the dists of the nodes.
  1087     typedef typename TR::DistMap DistMap;
  1088     ///The heap type used by the dijkstra algorithm.
  1089     typedef typename TR::Heap Heap;
  1090   public:
  1091     /// Constructor.
  1092     DijkstraWizard() : TR() {}
  1093 
  1094     /// Constructor that requires parameters.
  1095 
  1096     /// Constructor that requires parameters.
  1097     /// These parameters will be the default values for the traits class.
  1098     DijkstraWizard(const Digraph &g,const LengthMap &l, Node s=INVALID) :
  1099       TR(g,l,s) {}
  1100 
  1101     ///Copy constructor
  1102     DijkstraWizard(const TR &b) : TR(b) {}
  1103 
  1104     ~DijkstraWizard() {}
  1105 
  1106     ///Runs Dijkstra algorithm from a given node.
  1107     
  1108     ///Runs Dijkstra algorithm from a given node.
  1109     ///The node can be given by the \ref source function.
  1110     void run()
  1111     {
  1112       if(Base::_source==INVALID) throw UninitializedParameter();
  1113       Dijkstra<Digraph,LengthMap,TR> 
  1114 	dij(*reinterpret_cast<const Digraph*>(Base::_g),
  1115             *reinterpret_cast<const LengthMap*>(Base::_length));
  1116       if(Base::_pred) dij.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
  1117       if(Base::_dist) dij.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
  1118       dij.run(Base::_source);
  1119     }
  1120 
  1121     ///Runs Dijkstra algorithm from the given node.
  1122 
  1123     ///Runs Dijkstra algorithm from the given node.
  1124     ///\param s is the given source.
  1125     void run(Node s)
  1126     {
  1127       Base::_source=s;
  1128       run();
  1129     }
  1130 
  1131     template<class T>
  1132     struct DefPredMapBase : public Base {
  1133       typedef T PredMap;
  1134       static PredMap *createPredMap(const Digraph &) { return 0; };
  1135       DefPredMapBase(const TR &b) : TR(b) {}
  1136     };
  1137     
  1138     ///\brief \ref named-templ-param "Named parameter"
  1139     ///function for setting PredMap type
  1140     ///
  1141     /// \ref named-templ-param "Named parameter"
  1142     ///function for setting PredMap type
  1143     ///
  1144     template<class T>
  1145     DijkstraWizard<DefPredMapBase<T> > predMap(const T &t) 
  1146     {
  1147       Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
  1148       return DijkstraWizard<DefPredMapBase<T> >(*this);
  1149     }
  1150     
  1151     template<class T>
  1152     struct DefDistMapBase : public Base {
  1153       typedef T DistMap;
  1154       static DistMap *createDistMap(const Digraph &) { return 0; };
  1155       DefDistMapBase(const TR &b) : TR(b) {}
  1156     };
  1157     
  1158     ///\brief \ref named-templ-param "Named parameter"
  1159     ///function for setting DistMap type
  1160     ///
  1161     /// \ref named-templ-param "Named parameter"
  1162     ///function for setting DistMap type
  1163     ///
  1164     template<class T>
  1165     DijkstraWizard<DefDistMapBase<T> > distMap(const T &t) 
  1166     {
  1167       Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
  1168       return DijkstraWizard<DefDistMapBase<T> >(*this);
  1169     }
  1170     
  1171     /// Sets the source node, from which the Dijkstra algorithm runs.
  1172 
  1173     /// Sets the source node, from which the Dijkstra algorithm runs.
  1174     /// \param s is the source node.
  1175     DijkstraWizard<TR> &source(Node s) 
  1176     {
  1177       Base::_source=s;
  1178       return *this;
  1179     }
  1180     
  1181   };
  1182   
  1183   ///Function type interface for Dijkstra algorithm.
  1184 
  1185   /// \ingroup shortest_path
  1186   ///Function type interface for Dijkstra algorithm.
  1187   ///
  1188   ///This function also has several
  1189   ///\ref named-templ-func-param "named parameters",
  1190   ///they are declared as the members of class \ref DijkstraWizard.
  1191   ///The following
  1192   ///example shows how to use these parameters.
  1193   ///\code
  1194   ///  dijkstra(g,length,source).predMap(preds).run();
  1195   ///\endcode
  1196   ///\warning Don't forget to put the \ref DijkstraWizard::run() "run()"
  1197   ///to the end of the parameter list.
  1198   ///\sa DijkstraWizard
  1199   ///\sa Dijkstra
  1200   template<class GR, class LM>
  1201   DijkstraWizard<DijkstraWizardBase<GR,LM> >
  1202   dijkstra(const GR &g,const LM &l,typename GR::Node s=INVALID)
  1203   {
  1204     return DijkstraWizard<DijkstraWizardBase<GR,LM> >(g,l,s);
  1205   }
  1206 
  1207 } //END OF NAMESPACE LEMON
  1208 
  1209 #endif