lemon/johnson.h
author hegyi
Mon, 21 Nov 2005 18:03:20 +0000
changeset 1823 cb082cdf3667
parent 1765 f15b3c09481c
child 1864 1788205e36af
permissions -rw-r--r--
NewMapWin has become Dialog instead of Window. Therefore it is created dynamically, when there is need for it, instead of keeping one instance in memory. This solution is slower, but more correct than before.
     1 /* -*- C++ -*-
     2  * lemon/johnson.h - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     5  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     6  *
     7  * Permission to use, modify and distribute this software is granted
     8  * provided that this copyright notice appears in all copies. For
     9  * precise terms see the accompanying LICENSE file.
    10  *
    11  * This software is provided "AS IS" with no warranty of any kind,
    12  * express or implied, and with no claim as to its suitability for any
    13  * purpose.
    14  *
    15  */
    16 
    17 #ifndef LEMON_JOHNSON_H
    18 #define LEMON_JOHNSON_H
    19 
    20 ///\ingroup flowalgs
    21 /// \file
    22 /// \brief Johnson algorithm.
    23 ///
    24 
    25 #include <lemon/list_graph.h>
    26 #include <lemon/graph_utils.h>
    27 #include <lemon/dijkstra.h>
    28 #include <lemon/belmann_ford.h>
    29 #include <lemon/invalid.h>
    30 #include <lemon/error.h>
    31 #include <lemon/maps.h>
    32 #include <lemon/matrix_maps.h>
    33 
    34 #include <limits>
    35 
    36 namespace lemon {
    37 
    38   /// \brief Default OperationTraits for the Johnson algorithm class.
    39   ///  
    40   /// It defines all computational operations and constants which are
    41   /// used in the Floyd-Warshall algorithm. The default implementation
    42   /// is based on the numeric_limits class. If the numeric type does not
    43   /// have infinity value then the maximum value is used as extremal
    44   /// infinity value.
    45   template <
    46     typename Value, 
    47     bool has_infinity = std::numeric_limits<Value>::has_infinity>
    48   struct JohnsonDefaultOperationTraits {
    49     /// \brief Gives back the zero value of the type.
    50     static Value zero() {
    51       return static_cast<Value>(0);
    52     }
    53     /// \brief Gives back the positive infinity value of the type.
    54     static Value infinity() {
    55       return std::numeric_limits<Value>::infinity();
    56     }
    57     /// \brief Gives back the sum of the given two elements.
    58     static Value plus(const Value& left, const Value& right) {
    59       return left + right;
    60     }
    61     /// \brief Gives back true only if the first value less than the second.
    62     static bool less(const Value& left, const Value& right) {
    63       return left < right;
    64     }
    65   };
    66 
    67   template <typename Value>
    68   struct JohnsonDefaultOperationTraits<Value, false> {
    69     static Value zero() {
    70       return static_cast<Value>(0);
    71     }
    72     static Value infinity() {
    73       return std::numeric_limits<Value>::max();
    74     }
    75     static Value plus(const Value& left, const Value& right) {
    76       if (left == infinity() || right == infinity()) return infinity();
    77       return left + right;
    78     }
    79     static bool less(const Value& left, const Value& right) {
    80       return left < right;
    81     }
    82   };
    83   
    84   /// \brief Default traits class of Johnson class.
    85   ///
    86   /// Default traits class of Johnson class.
    87   /// \param _Graph Graph type.
    88   /// \param _LegthMap Type of length map.
    89   template<class _Graph, class _LengthMap>
    90   struct JohnsonDefaultTraits {
    91     /// The graph type the algorithm runs on. 
    92     typedef _Graph Graph;
    93 
    94     /// \brief The type of the map that stores the edge lengths.
    95     ///
    96     /// The type of the map that stores the edge lengths.
    97     /// It must meet the \ref concept::ReadMap "ReadMap" concept.
    98     typedef _LengthMap LengthMap;
    99 
   100     // The type of the length of the edges.
   101     typedef typename _LengthMap::Value Value;
   102 
   103     /// \brief Operation traits for belmann-ford algorithm.
   104     ///
   105     /// It defines the infinity type on the given Value type
   106     /// and the used operation.
   107     /// \see JohnsonDefaultOperationTraits
   108     typedef JohnsonDefaultOperationTraits<Value> OperationTraits;
   109 
   110     /// The cross reference type used by heap.
   111 
   112     /// The cross reference type used by heap.
   113     /// Usually it is \c Graph::NodeMap<int>.
   114     typedef typename Graph::template NodeMap<int> HeapCrossRef;
   115 
   116     ///Instantiates a HeapCrossRef.
   117 
   118     ///This function instantiates a \ref HeapCrossRef. 
   119     /// \param graph is the graph, to which we would like to define the 
   120     /// HeapCrossRef.
   121     static HeapCrossRef *createHeapCrossRef(const Graph& graph) {
   122       return new HeapCrossRef(graph);
   123     }
   124     
   125     ///The heap type used by Dijkstra algorithm.
   126 
   127     ///The heap type used by Dijkstra algorithm.
   128     ///
   129     ///\sa BinHeap
   130     ///\sa Dijkstra
   131     typedef BinHeap<typename Graph::Node, typename LengthMap::Value,
   132 		    HeapCrossRef, std::less<Value> > Heap;
   133 
   134     ///Instantiates a Heap.
   135 
   136     ///This function instantiates a \ref Heap. 
   137     /// \param crossRef The cross reference for the heap.
   138     static Heap *createHeap(HeapCrossRef& crossRef) {
   139       return new Heap(crossRef);
   140     }
   141  
   142     /// \brief The type of the matrix map that stores the last edges of the 
   143     /// shortest paths.
   144     /// 
   145     /// The type of the map that stores the last edges of the shortest paths.
   146     /// It must be a matrix map with \c Graph::Edge value type.
   147     ///
   148     typedef DynamicMatrixMap<Graph, typename Graph::Node, 
   149 			     typename Graph::Edge> PredMap;
   150 
   151     /// \brief Instantiates a PredMap.
   152     /// 
   153     /// This function instantiates a \ref PredMap. 
   154     /// \param G is the graph, to which we would like to define the PredMap.
   155     /// \todo The graph alone may be insufficient for the initialization
   156     static PredMap *createPredMap(const Graph& graph) {
   157       return new PredMap(graph);
   158     }
   159 
   160     /// \brief The type of the matrix map that stores the dists of the nodes.
   161     ///
   162     /// The type of the matrix map that stores the dists of the nodes.
   163     /// It must meet the \ref concept::WriteMatrixMap "WriteMatrixMap" concept.
   164     ///
   165     typedef DynamicMatrixMap<Graph, typename Graph::Node, Value> DistMap;
   166     
   167     /// \brief Instantiates a DistMap.
   168     ///
   169     /// This function instantiates a \ref DistMap. 
   170     /// \param G is the graph, to which we would like to define the 
   171     /// \ref DistMap
   172     static DistMap *createDistMap(const _Graph& graph) {
   173       return new DistMap(graph);
   174     }
   175 
   176   };
   177 
   178   /// \brief %Johnson algorithm class.
   179   ///
   180   /// \ingroup flowalgs
   181   /// This class provides an efficient implementation of \c %Johnson 
   182   /// algorithm. The edge lengths are passed to the algorithm using a
   183   /// \ref concept::ReadMap "ReadMap", so it is easy to change it to any 
   184   /// kind of length.
   185   ///
   186   /// The algorithm solves the shortest path problem for each pair
   187   /// of node when the edges can have negative length but the graph should
   188   /// not contain cycles with negative sum of length. If we can assume
   189   /// that all edge is non-negative in the graph then the dijkstra algorithm
   190   /// should be used from each node.
   191   ///
   192   /// The complexity of this algorithm is $O(n^2 * log(n) + n * log(n) * e)$ or
   193   /// with fibonacci heap O(n^2 * log(n) + n * e). Usually the fibonacci heap
   194   /// implementation is slower than either binary heap implementation or the 
   195   /// Floyd-Warshall algorithm. 
   196   ///
   197   /// The type of the length is determined by the
   198   /// \ref concept::ReadMap::Value "Value" of the length map.
   199   ///
   200   /// \param _Graph The graph type the algorithm runs on. The default value
   201   /// is \ref ListGraph. The value of _Graph is not used directly by
   202   /// Johnson, it is only passed to \ref JohnsonDefaultTraits.
   203   /// \param _LengthMap This read-only EdgeMap determines the lengths of the
   204   /// edges. It is read once for each edge, so the map may involve in
   205   /// relatively time consuming process to compute the edge length if
   206   /// it is necessary. The default map type is \ref
   207   /// concept::StaticGraph::EdgeMap "Graph::EdgeMap<int>".  The value
   208   /// of _LengthMap is not used directly by Johnson, it is only passed 
   209   /// to \ref JohnsonDefaultTraits.  \param _Traits Traits class to set
   210   /// various data types used by the algorithm.  The default traits
   211   /// class is \ref JohnsonDefaultTraits
   212   /// "JohnsonDefaultTraits<_Graph,_LengthMap>".  See \ref
   213   /// JohnsonDefaultTraits for the documentation of a Johnson traits
   214   /// class.
   215   ///
   216   /// \author Balazs Dezso
   217 
   218 #ifdef DOXYGEN
   219   template <typename _Graph, typename _LengthMap, typename _Traits>
   220 #else
   221   template <typename _Graph=ListGraph,
   222 	    typename _LengthMap=typename _Graph::template EdgeMap<int>,
   223 	    typename _Traits=JohnsonDefaultTraits<_Graph,_LengthMap> >
   224 #endif
   225   class Johnson {
   226   public:
   227     
   228     /// \brief \ref Exception for uninitialized parameters.
   229     ///
   230     /// This error represents problems in the initialization
   231     /// of the parameters of the algorithms.
   232 
   233     class UninitializedParameter : public lemon::UninitializedParameter {
   234     public:
   235       virtual const char* exceptionName() const {
   236 	return "lemon::Johnson::UninitializedParameter";
   237       }
   238     };
   239 
   240     typedef _Traits Traits;
   241     ///The type of the underlying graph.
   242     typedef typename _Traits::Graph Graph;
   243 
   244     typedef typename Graph::Node Node;
   245     typedef typename Graph::NodeIt NodeIt;
   246     typedef typename Graph::Edge Edge;
   247     typedef typename Graph::EdgeIt EdgeIt;
   248     
   249     /// \brief The type of the length of the edges.
   250     typedef typename _Traits::LengthMap::Value Value;
   251     /// \brief The type of the map that stores the edge lengths.
   252     typedef typename _Traits::LengthMap LengthMap;
   253     /// \brief The type of the map that stores the last
   254     /// edges of the shortest paths. The type of the PredMap
   255     /// is a matrix map for Edges
   256     typedef typename _Traits::PredMap PredMap;
   257     /// \brief The type of the map that stores the dists of the nodes.
   258     /// The type of the DistMap is a matrix map for Values
   259     typedef typename _Traits::DistMap DistMap;
   260     /// \brief The operation traits.
   261     typedef typename _Traits::OperationTraits OperationTraits;
   262     ///The cross reference type used for the current heap.
   263     typedef typename _Traits::HeapCrossRef HeapCrossRef;
   264     ///The heap type used by the dijkstra algorithm.
   265     typedef typename _Traits::Heap Heap;
   266   private:
   267     /// Pointer to the underlying graph.
   268     const Graph *graph;
   269     /// Pointer to the length map
   270     const LengthMap *length;
   271     ///Pointer to the map of predecessors edges.
   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 heap cross references.
   280     HeapCrossRef *_heap_cross_ref;
   281     ///Indicates if \ref _heap_cross_ref is locally allocated (\c true) or not.
   282     bool local_heap_cross_ref;
   283     ///Pointer to the heap.
   284     Heap *_heap;
   285     ///Indicates if \ref _heap is locally allocated (\c true) or not.
   286     bool local_heap;
   287 
   288     /// Creates the maps if necessary.
   289     void create_maps() {
   290       if(!_pred) {
   291 	local_pred = true;
   292 	_pred = Traits::createPredMap(*graph);
   293       }
   294       if(!_dist) {
   295 	local_dist = true;
   296 	_dist = Traits::createDistMap(*graph);
   297       }
   298       if (!_heap_cross_ref) {
   299 	local_heap_cross_ref = true;
   300 	_heap_cross_ref = Traits::createHeapCrossRef(*graph);
   301       }
   302       if (!_heap) {
   303 	local_heap = true;
   304 	_heap = Traits::createHeap(*_heap_cross_ref);
   305       }
   306     }
   307 
   308   public :
   309 
   310     /// \name Named template parameters
   311 
   312     ///@{
   313 
   314     template <class T>
   315     struct DefPredMapTraits : public Traits {
   316       typedef T PredMap;
   317       static PredMap *createPredMap(const Graph& graph) {
   318 	throw UninitializedParameter();
   319       }
   320     };
   321 
   322     /// \brief \ref named-templ-param "Named parameter" for setting PredMap 
   323     /// type
   324     /// \ref named-templ-param "Named parameter" for setting PredMap type
   325     ///
   326     template <class T>
   327     struct DefPredMap 
   328       : public Johnson< Graph, LengthMap, DefPredMapTraits<T> > {
   329       typedef Johnson< Graph, LengthMap, DefPredMapTraits<T> > Create;
   330     };
   331     
   332     template <class T>
   333     struct DefDistMapTraits : public Traits {
   334       typedef T DistMap;
   335       static DistMap *createDistMap(const Graph& graph) {
   336 	throw UninitializedParameter();
   337       }
   338     };
   339     /// \brief \ref named-templ-param "Named parameter" for setting DistMap 
   340     /// type
   341     ///
   342     /// \ref named-templ-param "Named parameter" for setting DistMap type
   343     ///
   344     template <class T>
   345     struct DefDistMap 
   346       : public Johnson< Graph, LengthMap, DefDistMapTraits<T> > {
   347       typedef Johnson< Graph, LengthMap, DefDistMapTraits<T> > Create;
   348     };
   349     
   350     template <class T>
   351     struct DefOperationTraitsTraits : public Traits {
   352       typedef T OperationTraits;
   353     };
   354     
   355     /// \brief \ref named-templ-param "Named parameter" for setting 
   356     /// OperationTraits type
   357     ///
   358     /// \ref named-templ-param "Named parameter" for setting 
   359     /// OperationTraits type
   360     template <class T>
   361     struct DefOperationTraits
   362       : public Johnson< Graph, LengthMap, DefOperationTraitsTraits<T> > {
   363       typedef Johnson< Graph, LengthMap, DefOperationTraitsTraits<T> > Create;
   364     };
   365 
   366     template <class H, class CR>
   367     struct DefHeapTraits : public Traits {
   368       typedef CR HeapCrossRef;
   369       typedef H Heap;
   370       static HeapCrossRef *createHeapCrossRef(const Graph &) {
   371 	throw UninitializedParameter();
   372       }
   373       static Heap *createHeap(HeapCrossRef &) 
   374       {
   375 	throw UninitializedParameter();
   376       }
   377     };
   378     ///\brief \ref named-templ-param "Named parameter" for setting heap and 
   379     ///cross reference type
   380 
   381     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   382     ///reference type
   383     ///
   384     template <class H, class CR = typename Graph::template NodeMap<int> >
   385     struct DefHeap
   386       : public Johnson< Graph, LengthMap, DefHeapTraits<H, CR> > { 
   387       typedef Johnson< Graph, LengthMap, DefHeapTraits<H, CR> > Create;
   388     };
   389 
   390     template <class H, class CR>
   391     struct DefStandardHeapTraits : public Traits {
   392       typedef CR HeapCrossRef;
   393       typedef H Heap;
   394       static HeapCrossRef *createHeapCrossRef(const Graph &G) {
   395 	return new HeapCrossRef(G);
   396       }
   397       static Heap *createHeap(HeapCrossRef &R) 
   398       {
   399 	return new Heap(R);
   400       }
   401     };
   402     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   403     ///reference type with automatic allocation
   404 
   405     ///\ref named-templ-param "Named parameter" for setting heap and cross 
   406     ///reference type. It can allocate the heap and the cross reference 
   407     ///object if the cross reference's constructor waits for the graph as 
   408     ///parameter and the heap's constructor waits for the cross reference.
   409     template <class H, class CR = typename Graph::template NodeMap<int> >
   410     struct DefStandardHeap
   411       : public Johnson< Graph, LengthMap, DefStandardHeapTraits<H, CR> > { 
   412       typedef Johnson< Graph, LengthMap, DefStandardHeapTraits<H, CR> > 
   413       Create;
   414     };
   415     
   416     ///@}
   417 
   418   protected:
   419 
   420     Johnson() {}
   421 
   422   public:      
   423 
   424     typedef Johnson Create;
   425     
   426     /// \brief Constructor.
   427     ///
   428     /// \param _graph the graph the algorithm will run on.
   429     /// \param _length the length map used by the algorithm.
   430     Johnson(const Graph& _graph, const LengthMap& _length) :
   431       graph(&_graph), length(&_length),
   432       _pred(0), local_pred(false),
   433       _dist(0), local_dist(false),
   434       _heap_cross_ref(0), local_heap_cross_ref(false),
   435       _heap(0), local_heap(false) {}
   436     
   437     ///Destructor.
   438     ~Johnson() {
   439       if (local_pred) delete _pred;
   440       if (local_dist) delete _dist;
   441       if (local_heap_cross_ref) delete _heap_cross_ref;
   442       if (local_heap) delete _heap;
   443     }
   444 
   445     /// \brief Sets the length map.
   446     ///
   447     /// Sets the length map.
   448     /// \return \c (*this)
   449     Johnson &lengthMap(const LengthMap &m) {
   450       length = &m;
   451       return *this;
   452     }
   453 
   454     /// \brief Sets the map storing the predecessor edges.
   455     ///
   456     /// Sets the map storing the predecessor edges.
   457     /// If you don't use this function before calling \ref run(),
   458     /// it will allocate one. The destuctor deallocates this
   459     /// automatically allocated map, of course.
   460     /// \return \c (*this)
   461     Johnson &predMap(PredMap &m) {
   462       if(local_pred) {
   463 	delete _pred;
   464 	local_pred=false;
   465       }
   466       _pred = &m;
   467       return *this;
   468     }
   469 
   470     /// \brief Sets the map storing the distances calculated by the algorithm.
   471     ///
   472     /// Sets the map storing the distances calculated by the algorithm.
   473     /// If you don't use this function before calling \ref run(),
   474     /// it will allocate one. The destuctor deallocates this
   475     /// automatically allocated map, of course.
   476     /// \return \c (*this)
   477     Johnson &distMap(DistMap &m) {
   478       if(local_dist) {
   479 	delete _dist;
   480 	local_dist=false;
   481       }
   482       _dist = &m;
   483       return *this;
   484     }
   485 
   486   protected:
   487     
   488     template <typename PotentialMap>
   489     void shiftedRun(const PotentialMap& potential) {
   490       
   491       typename Graph::template EdgeMap<Value> shiftlen(*graph);
   492       for (EdgeIt it(*graph);  it != INVALID; ++it) {
   493       	shiftlen[it] = (*length)[it] 
   494 	  + potential[graph->source(it)] 
   495 	  - potential[graph->target(it)];
   496       }
   497       
   498       typename Dijkstra<Graph, typename Graph::template EdgeMap<Value> >::
   499 	template DefHeap<Heap, HeapCrossRef>::
   500 	Create dijkstra(*graph, shiftlen);
   501 
   502       dijkstra.heap(*_heap, *_heap_cross_ref);
   503       
   504       for (NodeIt it(*graph); it != INVALID; ++it) {
   505 	dijkstra.run(it);
   506 	for (NodeIt jt(*graph); jt != INVALID; ++jt) {
   507 	  if (dijkstra.reached(jt)) {
   508 	    _dist->set(it, jt, dijkstra.dist(jt) + 
   509 		       potential[jt] - potential[it]);
   510 	    _pred->set(it, jt, dijkstra.predEdge(jt));
   511 	  } else {
   512 	    _dist->set(it, jt, OperationTraits::infinity());
   513 	    _pred->set(it, jt, INVALID);
   514 	  }
   515 	}
   516       }
   517     }
   518 
   519   public:    
   520 
   521     ///\name Execution control
   522     /// The simplest way to execute the algorithm is to use
   523     /// one of the member functions called \c run(...).
   524     /// \n
   525     /// If you need more control on the execution,
   526     /// Finally \ref start() will perform the actual path
   527     /// computation.
   528 
   529     ///@{
   530 
   531     /// \brief Initializes the internal data structures.
   532     /// 
   533     /// Initializes the internal data structures.
   534     void init() {
   535       create_maps();
   536     }
   537 
   538     /// \brief Executes the algorithm.
   539     ///
   540     /// This method runs the %Johnson algorithm in order to compute 
   541     /// the shortest path to each node pairs. The algorithm 
   542     /// computes 
   543     /// - The shortest path tree for each node.
   544     /// - The distance between each node pairs.
   545     void start() {
   546 
   547       typedef typename BelmannFord<Graph, LengthMap>::
   548       template DefOperationTraits<OperationTraits>::
   549       template DefPredMap<NullMap<Node, Edge> >::
   550       Create BelmannFordType;
   551       
   552       BelmannFordType belmannford(*graph, *length);
   553 
   554       NullMap<Node, Edge> predMap;
   555 
   556       belmannford.predMap(predMap);
   557       
   558       belmannford.init(OperationTraits::zero());
   559       belmannford.start();
   560 
   561       shiftedRun(belmannford.distMap());
   562     }
   563 
   564     /// \brief Executes the algorithm and checks the negatvie cycles.
   565     ///
   566     /// This method runs the %Johnson algorithm in order to compute 
   567     /// the shortest path to each node pairs. If the graph contains
   568     /// negative cycle it gives back false. The algorithm 
   569     /// computes 
   570     /// - The shortest path tree for each node.
   571     /// - The distance between each node pairs.
   572     bool checkedStart() {
   573       
   574       typedef typename BelmannFord<Graph, LengthMap>::
   575       template DefOperationTraits<OperationTraits>::
   576       template DefPredMap<NullMap<Node, Edge> >::
   577       Create BelmannFordType;
   578 
   579       BelmannFordType belmannford(*graph, *length);
   580 
   581       NullMap<Node, Edge> predMap;
   582 
   583       belmannford.predMap(predMap);
   584       
   585       belmannford.init(OperationTraits::zero());
   586       if (!belmannford.checkedStart()) return false;
   587 
   588       shiftedRun(belmannford.distMap());
   589       return true;
   590     }
   591 
   592     
   593     /// \brief Runs %Johnson algorithm.
   594     ///    
   595     /// This method runs the %Johnson algorithm from a each node
   596     /// in order to compute the shortest path to each node pairs. 
   597     /// The algorithm computes
   598     /// - The shortest path tree for each node.
   599     /// - The distance between each node pairs.
   600     ///
   601     /// \note d.run(s) is just a shortcut of the following code.
   602     /// \code
   603     ///  d.init();
   604     ///  d.start();
   605     /// \endcode
   606     void run() {
   607       init();
   608       start();
   609     }
   610     
   611     ///@}
   612 
   613     /// \name Query Functions
   614     /// The result of the %Johnson algorithm can be obtained using these
   615     /// functions.\n
   616     /// Before the use of these functions,
   617     /// either run() or start() must be called.
   618     
   619     ///@{
   620 
   621     /// \brief Copies the shortest path to \c t into \c p
   622     ///    
   623     /// This function copies the shortest path to \c t into \c p.
   624     /// If it \c t is a source itself or unreachable, then it does not
   625     /// alter \c p.
   626     /// \return Returns \c true if a path to \c t was actually copied to \c p,
   627     /// \c false otherwise.
   628     /// \sa DirPath
   629     template <typename Path>
   630     bool getPath(Path &p, Node source, Node target) {
   631       if (connected(source, target)) {
   632 	p.clear();
   633 	typename Path::Builder b(target);
   634 	for(b.setStartNode(target); predEdge(source, target) != INVALID;
   635 	    target = predNode(target)) {
   636 	  b.pushFront(predEdge(source, target));
   637 	}
   638 	b.commit();
   639 	return true;
   640       }
   641       return false;
   642     }
   643 	  
   644     /// \brief The distance between two nodes.
   645     ///
   646     /// Returns the distance between two nodes.
   647     /// \pre \ref run() must be called before using this function.
   648     /// \warning If node \c v in unreachable from the root the return value
   649     /// of this funcion is undefined.
   650     Value dist(Node source, Node target) const { 
   651       return (*_dist)(source, target); 
   652     }
   653 
   654     /// \brief Returns the 'previous edge' of the shortest path tree.
   655     ///
   656     /// For the node \c node it returns the 'previous edge' of the shortest 
   657     /// path tree to direction of the node \c root 
   658     /// i.e. it returns the last edge of a shortest path from the node \c root 
   659     /// to \c node. It is \ref INVALID if \c node is unreachable from the root
   660     /// or if \c node=root. The shortest path tree used here is equal to the 
   661     /// shortest path tree used in \ref predNode(). 
   662     /// \pre \ref run() must be called before using this function.
   663     Edge predEdge(Node root, Node node) const { 
   664       return (*_pred)(root, node); 
   665     }
   666 
   667     /// \brief Returns the 'previous node' of the shortest path tree.
   668     ///
   669     /// For a node \c node it returns the 'previous node' of the shortest path 
   670     /// tree to direction of the node \c root, i.e. it returns the last but 
   671     /// one node from a shortest path from the \c root to \c node. It is 
   672     /// INVALID if \c node is unreachable from the root or if \c node=root. 
   673     /// The shortest path tree used here is equal to the 
   674     /// shortest path tree used in \ref predEdge().  
   675     /// \pre \ref run() must be called before using this function.
   676     Node predNode(Node root, Node node) const { 
   677       return (*_pred)(root, node) == INVALID ? 
   678       INVALID : graph->source((*_pred)(root, node)); 
   679     }
   680     
   681     /// \brief Returns a reference to the matrix node map of distances.
   682     ///
   683     /// Returns a reference to the matrix node map of distances. 
   684     ///
   685     /// \pre \ref run() must be called before using this function.
   686     const DistMap &distMap() const { return *_dist;}
   687  
   688     /// \brief Returns a reference to the shortest path tree map.
   689     ///
   690     /// Returns a reference to the matrix node map of the edges of the
   691     /// shortest path tree.
   692     /// \pre \ref run() must be called before using this function.
   693     const PredMap &predMap() const { return *_pred;}
   694  
   695     /// \brief Checks if a node is reachable from the root.
   696     ///
   697     /// Returns \c true if \c v is reachable from the root.
   698     /// \pre \ref run() must be called before using this function.
   699     ///
   700     bool connected(Node source, Node target) { 
   701       return (*_dist)(source, target) != OperationTraits::infinity(); 
   702     }
   703     
   704     ///@}
   705   };
   706  
   707 } //END OF NAMESPACE LEMON
   708 
   709 #endif