lemon/dijkstra.h
 changeset 128 7cd965d2257f child 157 2ccc1afc2c52
equal inserted replaced
-1:000000000000 0:f1ae5201bbbd

     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