COIN-OR::LEMON - Graph Library

Ticket #51: 51-1-port-c9b9da1a90a0.patch

File 51-1-port-c9b9da1a90a0.patch, 36.8 KB (added by Peter Kovacs, 15 years ago)

Port the Bellman-Ford algorithm

  • lemon/Makefile.am

    # HG changeset patch
    # User Peter Kovacs <kpeter@inf.elte.hu>
    # Date 1248470383 -7200
    # Node ID c9b9da1a90a022b261c4cc379373efba6256bc85
    # Parent  9f529abcaebf13f19e61ba24fdd2c3631860af91
    Port Bellman-Ford algorithm from SVN -r3524 (#51)
    
    diff --git a/lemon/Makefile.am b/lemon/Makefile.am
    a b  
    5757        lemon/adaptors.h \
    5858        lemon/arg_parser.h \
    5959        lemon/assert.h \
     60        lemon/bellman_ford.h \
    6061        lemon/bfs.h \
    6162        lemon/bin_heap.h \
    6263        lemon/bucket_heap.h \
  • new file lemon/bellman_ford.h

    diff --git a/lemon/bellman_ford.h b/lemon/bellman_ford.h
    new file mode 100644
    - +  
     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
     34namespace 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