lemon/bellman_ford.h
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1946 17eb3eaad9f8
child 1993 2115143eceea
permissions -rw-r--r--
The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.

The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.

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