lemon/bellman_ford.h
author Peter Kovacs <kpeter@inf.elte.hu>
Fri, 24 Jul 2009 23:19:43 +0200
changeset 696 c9b9da1a90a0
child 697 9496ed797f20
permissions -rw-r--r--
Port Bellman-Ford algorithm from SVN -r3524 (#51)
     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_BELMANN_FORD_H
    20 #define LEMON_BELMANN_FORD_H
    21 
    22 /// \ingroup shortest_path
    23 /// \file
    24 /// \brief Bellman-Ford algorithm.
    25 ///
    26 
    27 #include <lemon/bits/path_dump.h>
    28 #include <lemon/core.h>
    29 #include <lemon/error.h>
    30 #include <lemon/maps.h>
    31 
    32 #include <limits>
    33 
    34 namespace lemon {
    35 
    36   /// \brief Default OperationTraits for the BellmanFord algorithm class.
    37   ///  
    38   /// It defines all computational operations and constants which are
    39   /// used in the Bellman-Ford algorithm. The default implementation
    40   /// is based on the numeric_limits class. If the numeric type does not
    41   /// have infinity value then the maximum value is used as extremal
    42   /// infinity value.
    43   template <
    44     typename Value, 
    45     bool has_infinity = std::numeric_limits<Value>::has_infinity>
    46   struct BellmanFordDefaultOperationTraits {
    47     /// \brief Gives back the zero value of the type.
    48     static Value zero() {
    49       return static_cast<Value>(0);
    50     }
    51     /// \brief Gives back the positive infinity value of the type.
    52     static Value infinity() {
    53       return std::numeric_limits<Value>::infinity();
    54     }
    55     /// \brief Gives back the sum of the given two elements.
    56     static Value plus(const Value& left, const Value& right) {
    57       return left + right;
    58     }
    59     /// \brief Gives back true only if the first value less than the second.
    60     static bool less(const Value& left, const Value& right) {
    61       return left < right;
    62     }
    63   };
    64 
    65   template <typename Value>
    66   struct BellmanFordDefaultOperationTraits<Value, false> {
    67     static Value zero() {
    68       return static_cast<Value>(0);
    69     }
    70     static Value infinity() {
    71       return std::numeric_limits<Value>::max();
    72     }
    73     static Value plus(const Value& left, const Value& right) {
    74       if (left == infinity() || right == infinity()) return infinity();
    75       return left + right;
    76     }
    77     static bool less(const Value& left, const Value& right) {
    78       return left < right;
    79     }
    80   };
    81   
    82   /// \brief Default traits class of BellmanFord class.
    83   ///
    84   /// Default traits class of BellmanFord class.
    85   /// \param _Digraph Digraph type.
    86   /// \param _LegthMap Type of length map.
    87   template<class _Digraph, class _LengthMap>
    88   struct BellmanFordDefaultTraits {
    89     /// The digraph type the algorithm runs on. 
    90     typedef _Digraph Digraph;
    91 
    92     /// \brief The type of the map that stores the arc lengths.
    93     ///
    94     /// The type of the map that stores the arc lengths.
    95     /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
    96     typedef _LengthMap LengthMap;
    97 
    98     // The type of the length of the arcs.
    99     typedef typename _LengthMap::Value Value;
   100 
   101     /// \brief Operation traits for Bellman-Ford algorithm.
   102     ///
   103     /// It defines the infinity type on the given Value type
   104     /// and the used operation.
   105     /// \see BellmanFordDefaultOperationTraits
   106     typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
   107  
   108     /// \brief The type of the map that stores the last arcs of the 
   109     /// shortest paths.
   110     /// 
   111     /// The type of the map that stores the last
   112     /// arcs of the shortest paths.
   113     /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
   114     ///
   115     typedef typename Digraph::template NodeMap<typename _Digraph::Arc> PredMap;
   116 
   117     /// \brief Instantiates a PredMap.
   118     /// 
   119     /// This function instantiates a \ref PredMap. 
   120     /// \param digraph is the digraph, to which we would like to define the PredMap.
   121     static PredMap *createPredMap(const _Digraph& digraph) {
   122       return new PredMap(digraph);
   123     }
   124 
   125     /// \brief The type of the map that stores the dists of the nodes.
   126     ///
   127     /// The type of the map that stores the dists of the nodes.
   128     /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
   129     ///
   130     typedef typename Digraph::template NodeMap<typename _LengthMap::Value> 
   131     DistMap;
   132 
   133     /// \brief Instantiates a DistMap.
   134     ///
   135     /// This function instantiates a \ref DistMap. 
   136     /// \param digraph is the digraph, to which we would like to define the 
   137     /// \ref DistMap
   138     static DistMap *createDistMap(const _Digraph& digraph) {
   139       return new DistMap(digraph);
   140     }
   141 
   142   };
   143   
   144   /// \brief %BellmanFord algorithm class.
   145   ///
   146   /// \ingroup shortest_path
   147   /// This class provides an efficient implementation of \c Bellman-Ford 
   148   /// algorithm. The arc lengths are passed to the algorithm using a
   149   /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
   150   /// kind of length.
   151   ///
   152   /// The Bellman-Ford algorithm solves the shortest path from one node
   153   /// problem when the arcs can have negative length but the digraph should
   154   /// not contain cycles with negative sum of length. If we can assume
   155   /// that all arc is non-negative in the digraph then the dijkstra algorithm
   156   /// should be used rather.
   157   ///
   158   /// The maximal time complexity of the algorithm is \f$ O(ne) \f$.
   159   ///
   160   /// The type of the length is determined by the
   161   /// \ref concepts::ReadMap::Value "Value" of the length map.
   162   ///
   163   /// \param _Digraph The digraph type the algorithm runs on. The default value
   164   /// is \ref ListDigraph. The value of _Digraph is not used directly by
   165   /// BellmanFord, it is only passed to \ref BellmanFordDefaultTraits.
   166   /// \param _LengthMap This read-only ArcMap determines the lengths of the
   167   /// arcs. The default map type is \ref concepts::Digraph::ArcMap 
   168   /// "Digraph::ArcMap<int>".  The value of _LengthMap is not used directly 
   169   /// by BellmanFord, it is only passed to \ref BellmanFordDefaultTraits.  
   170   /// \param _Traits Traits class to set various data types used by the 
   171   /// algorithm.  The default traits class is \ref BellmanFordDefaultTraits
   172   /// "BellmanFordDefaultTraits<_Digraph,_LengthMap>".  See \ref
   173   /// BellmanFordDefaultTraits for the documentation of a BellmanFord traits
   174   /// class.
   175 #ifdef DOXYGEN
   176   template <typename _Digraph, typename _LengthMap, typename _Traits>
   177 #else
   178   template <typename _Digraph,
   179 	    typename _LengthMap=typename _Digraph::template ArcMap<int>,
   180 	    typename _Traits=BellmanFordDefaultTraits<_Digraph,_LengthMap> >
   181 #endif
   182   class BellmanFord {
   183   public:
   184 
   185     typedef _Traits Traits;
   186     ///The type of the underlying digraph.
   187     typedef typename _Traits::Digraph Digraph;
   188 
   189     typedef typename Digraph::Node Node;
   190     typedef typename Digraph::NodeIt NodeIt;
   191     typedef typename Digraph::Arc Arc;
   192     typedef typename Digraph::OutArcIt OutArcIt;
   193     
   194     /// \brief The type of the length of the arcs.
   195     typedef typename _Traits::LengthMap::Value Value;
   196     /// \brief The type of the map that stores the arc lengths.
   197     typedef typename _Traits::LengthMap LengthMap;
   198     /// \brief The type of the map that stores the last
   199     /// arcs of the shortest paths.
   200     typedef typename _Traits::PredMap PredMap;
   201     /// \brief The type of the map that stores the dists of the nodes.
   202     typedef typename _Traits::DistMap DistMap;
   203     /// \brief The operation traits.
   204     typedef typename _Traits::OperationTraits OperationTraits;
   205   private:
   206     /// Pointer to the underlying digraph.
   207     const Digraph *digraph;
   208     /// Pointer to the length map
   209     const LengthMap *length;
   210     ///Pointer to the map of predecessors arcs.
   211     PredMap *_pred;
   212     ///Indicates if \ref _pred is locally allocated (\c true) or not.
   213     bool local_pred;
   214     ///Pointer to the map of distances.
   215     DistMap *_dist;
   216     ///Indicates if \ref _dist is locally allocated (\c true) or not.
   217     bool local_dist;
   218 
   219     typedef typename Digraph::template NodeMap<bool> MaskMap;
   220     MaskMap *_mask;
   221 
   222     std::vector<Node> _process;
   223 
   224     /// Creates the maps if necessary.
   225     void create_maps() {
   226       if(!_pred) {
   227 	local_pred = true;
   228 	_pred = Traits::createPredMap(*digraph);
   229       }
   230       if(!_dist) {
   231 	local_dist = true;
   232 	_dist = Traits::createDistMap(*digraph);
   233       }
   234       _mask = new MaskMap(*digraph, false);
   235     }
   236     
   237   public :
   238  
   239     typedef BellmanFord Create;
   240 
   241     /// \name Named template parameters
   242 
   243     ///@{
   244 
   245     template <class T>
   246     struct DefPredMapTraits : public Traits {
   247       typedef T PredMap;
   248       static PredMap *createPredMap(const Digraph&) {
   249         LEMON_ASSERT(false, "PredMap is not initialized");
   250         return 0; // ignore warnings
   251       }
   252     };
   253 
   254     /// \brief \ref named-templ-param "Named parameter" for setting PredMap 
   255     /// type
   256     /// \ref named-templ-param "Named parameter" for setting PredMap type
   257     ///
   258     template <class T>
   259     struct SetPredMap 
   260       : public BellmanFord< Digraph, LengthMap, DefPredMapTraits<T> > {
   261       typedef BellmanFord< Digraph, LengthMap, DefPredMapTraits<T> > Create;
   262     };
   263     
   264     template <class T>
   265     struct DefDistMapTraits : public Traits {
   266       typedef T DistMap;
   267       static DistMap *createDistMap(const Digraph&) {
   268         LEMON_ASSERT(false, "DistMap is not initialized");
   269         return 0; // ignore warnings
   270       }
   271     };
   272 
   273     /// \brief \ref named-templ-param "Named parameter" for setting DistMap 
   274     /// type
   275     ///
   276     /// \ref named-templ-param "Named parameter" for setting DistMap type
   277     ///
   278     template <class T>
   279     struct SetDistMap 
   280       : public BellmanFord< Digraph, LengthMap, DefDistMapTraits<T> > {
   281       typedef BellmanFord< Digraph, LengthMap, DefDistMapTraits<T> > Create;
   282     };
   283     
   284     template <class T>
   285     struct DefOperationTraitsTraits : public Traits {
   286       typedef T OperationTraits;
   287     };
   288     
   289     /// \brief \ref named-templ-param "Named parameter" for setting 
   290     /// OperationTraits type
   291     ///
   292     /// \ref named-templ-param "Named parameter" for setting OperationTraits
   293     /// type
   294     template <class T>
   295     struct SetOperationTraits
   296       : public BellmanFord< Digraph, LengthMap, DefOperationTraitsTraits<T> > {
   297       typedef BellmanFord< Digraph, LengthMap, DefOperationTraitsTraits<T> >
   298       Create;
   299     };
   300     
   301     ///@}
   302 
   303   protected:
   304     
   305     BellmanFord() {}
   306 
   307   public:      
   308     
   309     /// \brief Constructor.
   310     ///
   311     /// \param _graph the digraph the algorithm will run on.
   312     /// \param _length the length map used by the algorithm.
   313     BellmanFord(const Digraph& _graph, const LengthMap& _length) :
   314       digraph(&_graph), length(&_length),
   315       _pred(0), local_pred(false),
   316       _dist(0), local_dist(false), _mask(0) {}
   317     
   318     ///Destructor.
   319     ~BellmanFord() {
   320       if(local_pred) delete _pred;
   321       if(local_dist) delete _dist;
   322       if(_mask) delete _mask;
   323     }
   324 
   325     /// \brief Sets the length map.
   326     ///
   327     /// Sets the length map.
   328     /// \return \c (*this)
   329     BellmanFord &lengthMap(const LengthMap &m) {
   330       length = &m;
   331       return *this;
   332     }
   333 
   334     /// \brief Sets the map storing the predecessor arcs.
   335     ///
   336     /// Sets the map storing the predecessor arcs.
   337     /// If you don't use this function before calling \ref run(),
   338     /// it will allocate one. The destuctor deallocates this
   339     /// automatically allocated map, of course.
   340     /// \return \c (*this)
   341     BellmanFord &predMap(PredMap &m) {
   342       if(local_pred) {
   343 	delete _pred;
   344 	local_pred=false;
   345       }
   346       _pred = &m;
   347       return *this;
   348     }
   349 
   350     /// \brief Sets the map storing the distances calculated by the algorithm.
   351     ///
   352     /// Sets the map storing the distances calculated by the algorithm.
   353     /// If you don't use this function before calling \ref run(),
   354     /// it will allocate one. The destuctor deallocates this
   355     /// automatically allocated map, of course.
   356     /// \return \c (*this)
   357     BellmanFord &distMap(DistMap &m) {
   358       if(local_dist) {
   359 	delete _dist;
   360 	local_dist=false;
   361       }
   362       _dist = &m;
   363       return *this;
   364     }
   365 
   366     /// \name Execution control
   367     /// The simplest way to execute the algorithm is to use
   368     /// one of the member functions called \c run(...).
   369     /// \n
   370     /// If you need more control on the execution,
   371     /// first you must call \ref init(), then you can add several source nodes
   372     /// with \ref addSource().
   373     /// Finally \ref start() will perform the actual path
   374     /// computation.
   375 
   376     ///@{
   377 
   378     /// \brief Initializes the internal data structures.
   379     /// 
   380     /// Initializes the internal data structures.
   381     void init(const Value value = OperationTraits::infinity()) {
   382       create_maps();
   383       for (NodeIt it(*digraph); it != INVALID; ++it) {
   384 	_pred->set(it, INVALID);
   385 	_dist->set(it, value);
   386       }
   387       _process.clear();
   388       if (OperationTraits::less(value, OperationTraits::infinity())) {
   389 	for (NodeIt it(*digraph); it != INVALID; ++it) {
   390 	  _process.push_back(it);
   391 	  _mask->set(it, true);
   392 	}
   393       }
   394     }
   395     
   396     /// \brief Adds a new source node.
   397     ///
   398     /// Adds a new source node. The optional second parameter is the 
   399     /// initial distance of the node. It just sets the distance of the 
   400     /// node to the given value.
   401     void addSource(Node source, Value dst = OperationTraits::zero()) {
   402       _dist->set(source, dst);
   403       if (!(*_mask)[source]) {
   404 	_process.push_back(source);
   405 	_mask->set(source, true);
   406       }
   407     }
   408 
   409     /// \brief Executes one round from the Bellman-Ford algorithm.
   410     ///
   411     /// If the algoritm calculated the distances in the previous round
   412     /// exactly for all at most \f$ k \f$ length path lengths then it will
   413     /// calculate the distances exactly for all at most \f$ k + 1 \f$
   414     /// length path lengths. With \f$ k \f$ iteration this function
   415     /// calculates the at most \f$ k \f$ length path lengths.
   416     ///
   417     /// \warning The paths with limited arc number cannot be retrieved
   418     /// easily with \ref path() or \ref predArc() functions. If you
   419     /// need the shortest path and not just the distance you should store
   420     /// after each iteration the \ref predMap() map and manually build
   421     /// the path.
   422     ///
   423     /// \return \c true when the algorithm have not found more shorter
   424     /// paths.
   425     bool processNextRound() {
   426       for (int i = 0; i < int(_process.size()); ++i) {
   427 	_mask->set(_process[i], false);
   428       }
   429       std::vector<Node> nextProcess;
   430       std::vector<Value> values(_process.size());
   431       for (int i = 0; i < int(_process.size()); ++i) {
   432 	values[i] = (*_dist)[_process[i]];
   433       }
   434       for (int i = 0; i < int(_process.size()); ++i) {
   435 	for (OutArcIt it(*digraph, _process[i]); it != INVALID; ++it) {
   436 	  Node target = digraph->target(it);
   437 	  Value relaxed = OperationTraits::plus(values[i], (*length)[it]);
   438 	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
   439 	    _pred->set(target, it);
   440 	    _dist->set(target, relaxed);
   441 	    if (!(*_mask)[target]) {
   442 	      _mask->set(target, true);
   443 	      nextProcess.push_back(target);
   444 	    }
   445 	  }	  
   446 	}
   447       }
   448       _process.swap(nextProcess);
   449       return _process.empty();
   450     }
   451 
   452     /// \brief Executes one weak round from the Bellman-Ford algorithm.
   453     ///
   454     /// If the algorithm calculated the distances in the
   455     /// previous round at least for all at most k length paths then it will
   456     /// calculate the distances at least for all at most k + 1 length paths.
   457     /// This function does not make it possible to calculate strictly the
   458     /// at most k length minimal paths, this is why it is
   459     /// called just weak round.
   460     /// \return \c true when the algorithm have not found more shorter paths.
   461     bool processNextWeakRound() {
   462       for (int i = 0; i < int(_process.size()); ++i) {
   463 	_mask->set(_process[i], false);
   464       }
   465       std::vector<Node> nextProcess;
   466       for (int i = 0; i < int(_process.size()); ++i) {
   467 	for (OutArcIt it(*digraph, _process[i]); it != INVALID; ++it) {
   468 	  Node target = digraph->target(it);
   469 	  Value relaxed = 
   470 	    OperationTraits::plus((*_dist)[_process[i]], (*length)[it]);
   471 	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
   472 	    _pred->set(target, it);
   473 	    _dist->set(target, relaxed);
   474 	    if (!(*_mask)[target]) {
   475 	      _mask->set(target, true);
   476 	      nextProcess.push_back(target);
   477 	    }
   478 	  }	  
   479 	}
   480       }
   481       _process.swap(nextProcess);
   482       return _process.empty();
   483     }
   484 
   485     /// \brief Executes the algorithm.
   486     ///
   487     /// \pre init() must be called and at least one node should be added
   488     /// with addSource() before using this function.
   489     ///
   490     /// This method runs the %BellmanFord algorithm from the root node(s)
   491     /// in order to compute the shortest path to each node. The algorithm 
   492     /// computes 
   493     /// - The shortest path tree.
   494     /// - The distance of each node from the root(s).
   495     void start() {
   496       int num = countNodes(*digraph) - 1;
   497       for (int i = 0; i < num; ++i) {
   498 	if (processNextWeakRound()) break;
   499       }
   500     }
   501 
   502     /// \brief Executes the algorithm and checks the negative cycles.
   503     ///
   504     /// \pre init() must be called and at least one node should be added
   505     /// with addSource() before using this function. 
   506     ///
   507     /// This method runs the %BellmanFord algorithm from the root node(s)
   508     /// in order to compute the shortest path to each node. The algorithm 
   509     /// computes 
   510     /// - The shortest path tree.
   511     /// - The distance of each node from the root(s).
   512     /// 
   513     /// \return \c false if there is a negative cycle in the digraph.
   514     bool checkedStart() {
   515       int num = countNodes(*digraph);
   516       for (int i = 0; i < num; ++i) {
   517 	if (processNextWeakRound()) return true;
   518       }
   519       return _process.empty();
   520     }
   521 
   522     /// \brief Executes the algorithm with path length limit.
   523     ///
   524     /// \pre init() must be called and at least one node should be added
   525     /// with addSource() before using this function.
   526     ///
   527     /// This method runs the %BellmanFord algorithm from the root
   528     /// node(s) in order to compute the shortest path lengths with at
   529     /// most \c num arc.
   530     ///
   531     /// \warning The paths with limited arc number cannot be retrieved
   532     /// easily with \ref path() or \ref predArc() functions. If you
   533     /// need the shortest path and not just the distance you should store
   534     /// after each iteration the \ref predMap() map and manually build
   535     /// the path.
   536     ///
   537     /// The algorithm computes
   538     /// - The predecessor arc from each node.
   539     /// - The limited distance of each node from the root(s).
   540     void limitedStart(int num) {
   541       for (int i = 0; i < num; ++i) {
   542 	if (processNextRound()) break;
   543       }
   544     }
   545     
   546     /// \brief Runs %BellmanFord algorithm from node \c s.
   547     ///    
   548     /// This method runs the %BellmanFord algorithm from a root node \c s
   549     /// in order to compute the shortest path to each node. The algorithm 
   550     /// computes
   551     /// - The shortest path tree.
   552     /// - The distance of each node from the root.
   553     ///
   554     /// \note d.run(s) is just a shortcut of the following code.
   555     ///\code
   556     ///  d.init();
   557     ///  d.addSource(s);
   558     ///  d.start();
   559     ///\endcode
   560     void run(Node s) {
   561       init();
   562       addSource(s);
   563       start();
   564     }
   565     
   566     /// \brief Runs %BellmanFord algorithm with limited path length 
   567     /// from node \c s.
   568     ///    
   569     /// This method runs the %BellmanFord algorithm from a root node \c s
   570     /// in order to compute the shortest path with at most \c len arcs 
   571     /// to each node. The algorithm computes
   572     /// - The shortest path tree.
   573     /// - The distance of each node from the root.
   574     ///
   575     /// \note d.run(s, num) is just a shortcut of the following code.
   576     ///\code
   577     ///  d.init();
   578     ///  d.addSource(s);
   579     ///  d.limitedStart(num);
   580     ///\endcode
   581     void run(Node s, int num) {
   582       init();
   583       addSource(s);
   584       limitedStart(num);
   585     }
   586     
   587     ///@}
   588 
   589     /// \name Query Functions
   590     /// The result of the %BellmanFord algorithm can be obtained using these
   591     /// functions.\n
   592     /// Before the use of these functions,
   593     /// either run() or start() must be called.
   594     
   595     ///@{
   596 
   597     /// \brief Lemon iterator for get the active nodes.
   598     ///
   599     /// Lemon iterator for get the active nodes. This class provides a
   600     /// common style lemon iterator which gives back a subset of the
   601     /// nodes. The iterated nodes are active in the algorithm after
   602     /// the last phase so these should be checked in the next phase to
   603     /// find augmenting arcs from these.
   604     class ActiveIt {
   605     public:
   606 
   607       /// \brief Constructor.
   608       ///
   609       /// Constructor for get the nodeset of the variable. 
   610       ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
   611       {
   612         _index = _algorithm->_process.size() - 1;
   613       }
   614 
   615       /// \brief Invalid constructor.
   616       ///
   617       /// Invalid constructor.
   618       ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
   619 
   620       /// \brief Conversion to node.
   621       ///
   622       /// Conversion to node.
   623       operator Node() const { 
   624         return _index >= 0 ? _algorithm->_process[_index] : INVALID;
   625       }
   626 
   627       /// \brief Increment operator.
   628       ///
   629       /// Increment operator.
   630       ActiveIt& operator++() {
   631         --_index;
   632         return *this; 
   633       }
   634 
   635       bool operator==(const ActiveIt& it) const { 
   636         return static_cast<Node>(*this) == static_cast<Node>(it); 
   637       }
   638       bool operator!=(const ActiveIt& it) const { 
   639         return static_cast<Node>(*this) != static_cast<Node>(it); 
   640       }
   641       bool operator<(const ActiveIt& it) const { 
   642         return static_cast<Node>(*this) < static_cast<Node>(it); 
   643       }
   644       
   645     private:
   646       const BellmanFord* _algorithm;
   647       int _index;
   648     };
   649 
   650     typedef PredMapPath<Digraph, PredMap> Path;
   651 
   652     /// \brief Gives back the shortest path.
   653     ///    
   654     /// Gives back the shortest path.
   655     /// \pre The \c t should be reachable from the source.
   656     Path path(Node t) 
   657     {
   658       return Path(*digraph, *_pred, t);
   659     }
   660 
   661 
   662     // TODO : implement negative cycle
   663 //     /// \brief Gives back a negative cycle.
   664 //     ///    
   665 //     /// This function gives back a negative cycle.
   666 //     /// If the algorithm have not found yet negative cycle it will give back
   667 //     /// an empty path.
   668 //     Path negativeCycle() {
   669 //       typename Digraph::template NodeMap<int> state(*digraph, 0);
   670 //       for (ActiveIt it(*this); it != INVALID; ++it) {
   671 //         if (state[it] == 0) {
   672 //           for (Node t = it; predArc(t) != INVALID; t = predNode(t)) {
   673 //             if (state[t] == 0) {
   674 //               state[t] = 1;
   675 //             } else if (state[t] == 2) {
   676 //               break;
   677 //             } else {
   678 //               p.clear();
   679 //               typename Path::Builder b(p);
   680 //               b.setStartNode(t);
   681 //               b.pushFront(predArc(t));
   682 //               for(Node s = predNode(t); s != t; s = predNode(s)) {
   683 //                 b.pushFront(predArc(s));
   684 //               }
   685 //               b.commit();
   686 //               return true;
   687 //             }
   688 //           }
   689 //           for (Node t = it; predArc(t) != INVALID; t = predNode(t)) {
   690 //             if (state[t] == 1) {
   691 //               state[t] = 2;
   692 //             } else {
   693 //               break;
   694 //             }
   695 //           }
   696 //         }
   697 //       }
   698 //       return false;
   699 //     }
   700 	  
   701     /// \brief The distance of a node from the root.
   702     ///
   703     /// Returns the distance of a node from the root.
   704     /// \pre \ref run() must be called before using this function.
   705     /// \warning If node \c v in unreachable from the root the return value
   706     /// of this funcion is undefined.
   707     Value dist(Node v) const { return (*_dist)[v]; }
   708 
   709     /// \brief Returns the 'previous arc' of the shortest path tree.
   710     ///
   711     /// For a node \c v it returns the 'previous arc' of the shortest path 
   712     /// tree, i.e. it returns the last arc of a shortest path from the root 
   713     /// to \c v. It is \ref INVALID if \c v is unreachable from the root or 
   714     /// if \c v=s. The shortest path tree used here is equal to the shortest 
   715     /// path tree used in \ref predNode(). 
   716     /// \pre \ref run() must be called before using
   717     /// this function.
   718     Arc predArc(Node v) const { return (*_pred)[v]; }
   719 
   720     /// \brief Returns the 'previous node' of the shortest path tree.
   721     ///
   722     /// For a node \c v it returns the 'previous node' of the shortest path 
   723     /// tree, i.e. it returns the last but one node from a shortest path from 
   724     /// the root to \c /v. It is INVALID if \c v is unreachable from the root 
   725     /// or if \c v=s. The shortest path tree used here is equal to the 
   726     /// shortest path tree used in \ref predArc().  \pre \ref run() must be 
   727     /// called before using this function.
   728     Node predNode(Node v) const { 
   729       return (*_pred)[v] == INVALID ? INVALID : digraph->source((*_pred)[v]); 
   730     }
   731     
   732     /// \brief Returns a reference to the NodeMap of distances.
   733     ///
   734     /// Returns a reference to the NodeMap of distances. \pre \ref run() must
   735     /// be called before using this function.
   736     const DistMap &distMap() const { return *_dist;}
   737  
   738     /// \brief Returns a reference to the shortest path tree map.
   739     ///
   740     /// Returns a reference to the NodeMap of the arcs of the
   741     /// shortest path tree.
   742     /// \pre \ref run() must be called before using this function.
   743     const PredMap &predMap() const { return *_pred; }
   744  
   745     /// \brief Checks if a node is reachable from the root.
   746     ///
   747     /// Returns \c true if \c v is reachable from the root.
   748     /// \pre \ref run() must be called before using this function.
   749     ///
   750     bool reached(Node v) { return (*_dist)[v] != OperationTraits::infinity(); }
   751     
   752     ///@}
   753   };
   754  
   755   /// \brief Default traits class of BellmanFord function.
   756   ///
   757   /// Default traits class of BellmanFord function.
   758   /// \param _Digraph Digraph type.
   759   /// \param _LengthMap Type of length map.
   760   template <typename _Digraph, typename _LengthMap>
   761   struct BellmanFordWizardDefaultTraits {
   762     /// \brief The digraph type the algorithm runs on. 
   763     typedef _Digraph Digraph;
   764 
   765     /// \brief The type of the map that stores the arc lengths.
   766     ///
   767     /// The type of the map that stores the arc lengths.
   768     /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
   769     typedef _LengthMap LengthMap;
   770 
   771     /// \brief The value type of the length map.
   772     typedef typename _LengthMap::Value Value;
   773 
   774     /// \brief Operation traits for Bellman-Ford algorithm.
   775     ///
   776     /// It defines the infinity type on the given Value type
   777     /// and the used operation.
   778     /// \see BellmanFordDefaultOperationTraits
   779     typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
   780 
   781     /// \brief The type of the map that stores the last
   782     /// arcs of the shortest paths.
   783     /// 
   784     /// The type of the map that stores the last
   785     /// arcs of the shortest paths.
   786     /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
   787     typedef NullMap <typename _Digraph::Node,typename _Digraph::Arc> PredMap;
   788 
   789     /// \brief Instantiates a PredMap.
   790     /// 
   791     /// This function instantiates a \ref PredMap. 
   792     static PredMap *createPredMap(const _Digraph &) {
   793       return new PredMap();
   794     }
   795     /// \brief The type of the map that stores the dists of the nodes.
   796     ///
   797     /// The type of the map that stores the dists of the nodes.
   798     /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
   799     typedef NullMap<typename Digraph::Node, Value> DistMap;
   800     /// \brief Instantiates a DistMap.
   801     ///
   802     /// This function instantiates a \ref DistMap. 
   803     static DistMap *createDistMap(const _Digraph &) {
   804       return new DistMap();
   805     }
   806   };
   807   
   808   /// \brief Default traits used by \ref BellmanFordWizard
   809   ///
   810   /// To make it easier to use BellmanFord algorithm
   811   /// we have created a wizard class.
   812   /// This \ref BellmanFordWizard class needs default traits,
   813   /// as well as the \ref BellmanFord class.
   814   /// The \ref BellmanFordWizardBase is a class to be the default traits of the
   815   /// \ref BellmanFordWizard class.
   816   /// \todo More named parameters are required...
   817   template<class _Digraph,class _LengthMap>
   818   class BellmanFordWizardBase 
   819     : public BellmanFordWizardDefaultTraits<_Digraph,_LengthMap> {
   820 
   821     typedef BellmanFordWizardDefaultTraits<_Digraph,_LengthMap> Base;
   822   protected:
   823     /// Type of the nodes in the digraph.
   824     typedef typename Base::Digraph::Node Node;
   825 
   826     /// Pointer to the underlying digraph.
   827     void *_graph;
   828     /// Pointer to the length map
   829     void *_length;
   830     ///Pointer to the map of predecessors arcs.
   831     void *_pred;
   832     ///Pointer to the map of distances.
   833     void *_dist;
   834     ///Pointer to the source node.
   835     Node _source;
   836 
   837     public:
   838     /// Constructor.
   839     
   840     /// This constructor does not require parameters, therefore it initiates
   841     /// all of the attributes to default values (0, INVALID).
   842     BellmanFordWizardBase() : _graph(0), _length(0), _pred(0),
   843 			   _dist(0), _source(INVALID) {}
   844 
   845     /// Constructor.
   846     
   847     /// This constructor requires some parameters,
   848     /// listed in the parameters list.
   849     /// Others are initiated to 0.
   850     /// \param digraph is the initial value of  \ref _graph
   851     /// \param length is the initial value of  \ref _length
   852     /// \param source is the initial value of  \ref _source
   853     BellmanFordWizardBase(const _Digraph& digraph, 
   854 			  const _LengthMap& length, 
   855 			  Node source = INVALID) :
   856       _graph(reinterpret_cast<void*>(const_cast<_Digraph*>(&digraph))), 
   857       _length(reinterpret_cast<void*>(const_cast<_LengthMap*>(&length))), 
   858       _pred(0), _dist(0), _source(source) {}
   859 
   860   };
   861   
   862   /// A class to make the usage of BellmanFord algorithm easier
   863 
   864   /// This class is created to make it easier to use BellmanFord algorithm.
   865   /// It uses the functions and features of the plain \ref BellmanFord,
   866   /// but it is much simpler to use it.
   867   ///
   868   /// Simplicity means that the way to change the types defined
   869   /// in the traits class is based on functions that returns the new class
   870   /// and not on templatable built-in classes.
   871   /// When using the plain \ref BellmanFord
   872   /// the new class with the modified type comes from
   873   /// the original class by using the ::
   874   /// operator. In the case of \ref BellmanFordWizard only
   875   /// a function have to be called and it will
   876   /// return the needed class.
   877   ///
   878   /// It does not have own \ref run method. When its \ref run method is called
   879   /// it initiates a plain \ref BellmanFord class, and calls the \ref 
   880   /// BellmanFord::run method of it.
   881   template<class _Traits>
   882   class BellmanFordWizard : public _Traits {
   883     typedef _Traits Base;
   884 
   885     ///The type of the underlying digraph.
   886     typedef typename _Traits::Digraph Digraph;
   887 
   888     typedef typename Digraph::Node Node;
   889     typedef typename Digraph::NodeIt NodeIt;
   890     typedef typename Digraph::Arc Arc;
   891     typedef typename Digraph::OutArcIt ArcIt;
   892     
   893     ///The type of the map that stores the arc lengths.
   894     typedef typename _Traits::LengthMap LengthMap;
   895 
   896     ///The type of the length of the arcs.
   897     typedef typename LengthMap::Value Value;
   898 
   899     ///\brief The type of the map that stores the last
   900     ///arcs of the shortest paths.
   901     typedef typename _Traits::PredMap PredMap;
   902 
   903     ///The type of the map that stores the dists of the nodes.
   904     typedef typename _Traits::DistMap DistMap;
   905 
   906   public:
   907     /// Constructor.
   908     BellmanFordWizard() : _Traits() {}
   909 
   910     /// \brief Constructor that requires parameters.
   911     ///
   912     /// Constructor that requires parameters.
   913     /// These parameters will be the default values for the traits class.
   914     BellmanFordWizard(const Digraph& digraph, const LengthMap& length, 
   915 		      Node src = INVALID) 
   916       : _Traits(digraph, length, src) {}
   917 
   918     /// \brief Copy constructor
   919     BellmanFordWizard(const _Traits &b) : _Traits(b) {}
   920 
   921     ~BellmanFordWizard() {}
   922 
   923     /// \brief Runs BellmanFord algorithm from a given node.
   924     ///    
   925     /// Runs BellmanFord algorithm from a given node.
   926     /// The node can be given by the \ref source function.
   927     void run() {
   928       LEMON_ASSERT(Base::_source != INVALID, "Source node is not given");
   929       BellmanFord<Digraph,LengthMap,_Traits> 
   930 	bf(*reinterpret_cast<const Digraph*>(Base::_graph), 
   931            *reinterpret_cast<const LengthMap*>(Base::_length));
   932       if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
   933       if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
   934       bf.run(Base::_source);
   935     }
   936 
   937     /// \brief Runs BellmanFord algorithm from the given node.
   938     ///
   939     /// Runs BellmanFord algorithm from the given node.
   940     /// \param src is the given source.
   941     void run(Node src) {
   942       Base::_source = src;
   943       run();
   944     }
   945 
   946     template<class T>
   947     struct DefPredMapBase : public Base {
   948       typedef T PredMap;
   949       static PredMap *createPredMap(const Digraph &) { return 0; };
   950       DefPredMapBase(const _Traits &b) : _Traits(b) {}
   951     };
   952     
   953     ///\brief \ref named-templ-param "Named parameter"
   954     ///function for setting PredMap type
   955     ///
   956     /// \ref named-templ-param "Named parameter"
   957     ///function for setting PredMap type
   958     ///
   959     template<class T>
   960     BellmanFordWizard<DefPredMapBase<T> > predMap(const T &t) 
   961     {
   962       Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
   963       return BellmanFordWizard<DefPredMapBase<T> >(*this);
   964     }
   965     
   966     template<class T>
   967     struct DefDistMapBase : public Base {
   968       typedef T DistMap;
   969       static DistMap *createDistMap(const Digraph &) { return 0; };
   970       DefDistMapBase(const _Traits &b) : _Traits(b) {}
   971     };
   972     
   973     ///\brief \ref named-templ-param "Named parameter"
   974     ///function for setting DistMap type
   975     ///
   976     /// \ref named-templ-param "Named parameter"
   977     ///function for setting DistMap type
   978     ///
   979     template<class T>
   980     BellmanFordWizard<DefDistMapBase<T> > distMap(const T &t) {
   981       Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
   982       return BellmanFordWizard<DefDistMapBase<T> >(*this);
   983     }
   984 
   985     template<class T>
   986     struct DefOperationTraitsBase : public Base {
   987       typedef T OperationTraits;
   988       DefOperationTraitsBase(const _Traits &b) : _Traits(b) {}
   989     };
   990     
   991     ///\brief \ref named-templ-param "Named parameter"
   992     ///function for setting OperationTraits type
   993     ///
   994     /// \ref named-templ-param "Named parameter"
   995     ///function for setting OperationTraits type
   996     ///
   997     template<class T>
   998     BellmanFordWizard<DefOperationTraitsBase<T> > distMap() {
   999       return BellmanFordWizard<DefDistMapBase<T> >(*this);
  1000     }
  1001     
  1002     /// \brief Sets the source node, from which the BellmanFord algorithm runs.
  1003     ///
  1004     /// Sets the source node, from which the BellmanFord algorithm runs.
  1005     /// \param src is the source node.
  1006     BellmanFordWizard<_Traits>& source(Node src) {
  1007       Base::_source = src;
  1008       return *this;
  1009     }
  1010     
  1011   };
  1012   
  1013   /// \brief Function type interface for BellmanFord algorithm.
  1014   ///
  1015   /// \ingroup shortest_path
  1016   /// Function type interface for BellmanFord algorithm.
  1017   ///
  1018   /// This function also has several \ref named-templ-func-param 
  1019   /// "named parameters", they are declared as the members of class 
  1020   /// \ref BellmanFordWizard.
  1021   /// The following
  1022   /// example shows how to use these parameters.
  1023   ///\code
  1024   /// bellmanford(g,length,source).predMap(preds).run();
  1025   ///\endcode
  1026   /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
  1027   /// to the end of the parameter list.
  1028   /// \sa BellmanFordWizard
  1029   /// \sa BellmanFord
  1030   template<class _Digraph, class _LengthMap>
  1031   BellmanFordWizard<BellmanFordWizardBase<_Digraph,_LengthMap> >
  1032   bellmanFord(const _Digraph& digraph,
  1033 	      const _LengthMap& length, 
  1034 	      typename _Digraph::Node source = INVALID) {
  1035     return BellmanFordWizard<BellmanFordWizardBase<_Digraph,_LengthMap> >
  1036       (digraph, length, source);
  1037   }
  1038 
  1039 } //END OF NAMESPACE LEMON
  1040 
  1041 #endif
  1042