lemon/floyd_warshall.h
author deba
Tue, 17 Oct 2006 10:50:57 +0000
changeset 2247 269a0dcee70b
parent 2151 38ec4a930c05
child 2260 4274224f8a7d
permissions -rw-r--r--
Update the Path concept
Concept check for paths

DirPath renamed to Path
The interface updated to the new lemon interface
Make difference between the empty path and the path from one node
Builder interface have not been changed
// I wanted but there was not accordance about it

UPath is removed
It was a buggy implementation, it could not iterate on the
nodes in the right order
Right way to use undirected paths => path of edges in undirected graphs

The tests have been modified to the current implementation
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_FLOYD_WARSHALL_H
deba@1699
    20
#define LEMON_FLOYD_WARSHALL_H
deba@1699
    21
deba@1699
    22
///\ingroup flowalgs
deba@1699
    23
/// \file
deba@1699
    24
/// \brief FloydWarshall algorithm.
deba@1699
    25
///
deba@1699
    26
deba@1699
    27
#include <lemon/list_graph.h>
deba@1699
    28
#include <lemon/graph_utils.h>
deba@1993
    29
#include <lemon/bits/invalid.h>
deba@1699
    30
#include <lemon/error.h>
deba@1723
    31
#include <lemon/matrix_maps.h>
deba@1699
    32
#include <lemon/maps.h>
deba@1699
    33
deba@1699
    34
#include <limits>
deba@1699
    35
deba@1699
    36
namespace lemon {
deba@1699
    37
deba@1699
    38
  /// \brief Default OperationTraits for the FloydWarshall algorithm class.
deba@1699
    39
  ///  
deba@1699
    40
  /// It defines all computational operations and constants which are
deba@1699
    41
  /// used in the Floyd-Warshall algorithm. The default implementation
deba@1699
    42
  /// is based on the numeric_limits class. If the numeric type does not
deba@1699
    43
  /// have infinity value then the maximum value is used as extremal
deba@1699
    44
  /// infinity value.
deba@1699
    45
  template <
deba@1699
    46
    typename Value, 
deba@1699
    47
    bool has_infinity = std::numeric_limits<Value>::has_infinity>
deba@1699
    48
  struct FloydWarshallDefaultOperationTraits {
deba@1699
    49
    /// \brief Gives back the zero value of the type.
deba@1699
    50
    static Value zero() {
deba@1699
    51
      return static_cast<Value>(0);
deba@1699
    52
    }
deba@1699
    53
    /// \brief Gives back the positive infinity value of the type.
deba@1699
    54
    static Value infinity() {
deba@1699
    55
      return std::numeric_limits<Value>::infinity();
deba@1699
    56
    }
deba@1699
    57
    /// \brief Gives back the sum of the given two elements.
deba@1699
    58
    static Value plus(const Value& left, const Value& right) {
deba@1699
    59
      return left + right;
deba@1699
    60
    }
deba@1699
    61
    /// \brief Gives back true only if the first value less than the second.
deba@1699
    62
    static bool less(const Value& left, const Value& right) {
deba@1699
    63
      return left < right;
deba@1699
    64
    }
deba@1699
    65
  };
deba@1699
    66
deba@1699
    67
  template <typename Value>
deba@1699
    68
  struct FloydWarshallDefaultOperationTraits<Value, false> {
deba@1699
    69
    static Value zero() {
deba@1699
    70
      return static_cast<Value>(0);
deba@1699
    71
    }
deba@1699
    72
    static Value infinity() {
deba@1699
    73
      return std::numeric_limits<Value>::max();
deba@1699
    74
    }
deba@1699
    75
    static Value plus(const Value& left, const Value& right) {
deba@1699
    76
      if (left == infinity() || right == infinity()) return infinity();
deba@1699
    77
      return left + right;
deba@1699
    78
    }
deba@1699
    79
    static bool less(const Value& left, const Value& right) {
deba@1699
    80
      return left < right;
deba@1699
    81
    }
deba@1699
    82
  };
deba@1699
    83
  
deba@1699
    84
  /// \brief Default traits class of FloydWarshall class.
deba@1699
    85
  ///
deba@1699
    86
  /// Default traits class of FloydWarshall class.
deba@1699
    87
  /// \param _Graph Graph type.
deba@1699
    88
  /// \param _LegthMap Type of length map.
deba@1699
    89
  template<class _Graph, class _LengthMap>
deba@1699
    90
  struct FloydWarshallDefaultTraits {
deba@1699
    91
    /// The graph type the algorithm runs on. 
deba@1699
    92
    typedef _Graph Graph;
deba@1699
    93
deba@1699
    94
    /// \brief The type of the map that stores the edge lengths.
deba@1699
    95
    ///
deba@1699
    96
    /// The type of the map that stores the edge lengths.
deba@1699
    97
    /// It must meet the \ref concept::ReadMap "ReadMap" concept.
deba@1699
    98
    typedef _LengthMap LengthMap;
deba@1699
    99
deba@1699
   100
    // The type of the length of the edges.
deba@1699
   101
    typedef typename _LengthMap::Value Value;
deba@1699
   102
deba@1865
   103
    /// \brief Operation traits for floyd-warshall algorithm.
deba@1699
   104
    ///
deba@1699
   105
    /// It defines the infinity type on the given Value type
deba@1699
   106
    /// and the used operation.
deba@1699
   107
    /// \see FloydWarshallDefaultOperationTraits
deba@1699
   108
    typedef FloydWarshallDefaultOperationTraits<Value> OperationTraits;
deba@1699
   109
 
deba@1723
   110
    /// \brief The type of the matrix map that stores the last edges of the 
deba@1699
   111
    /// shortest paths.
deba@1699
   112
    /// 
deba@1723
   113
    /// The type of the map that stores the last edges of the shortest paths.
deba@1699
   114
    /// It must be a matrix map with \c Graph::Edge value type.
deba@1699
   115
    ///
deba@1723
   116
    typedef DynamicMatrixMap<Graph, typename Graph::Node, 
deba@1723
   117
			     typename Graph::Edge> PredMap;
deba@1699
   118
deba@1699
   119
    /// \brief Instantiates a PredMap.
deba@1699
   120
    /// 
deba@1699
   121
    /// This function instantiates a \ref PredMap. 
alpar@1946
   122
    /// \param graph is the graph,
alpar@1946
   123
    /// to which we would like to define the PredMap.
deba@1699
   124
    /// \todo The graph alone may be insufficient for the initialization
deba@1699
   125
    static PredMap *createPredMap(const _Graph& graph) {
deba@1699
   126
      return new PredMap(graph);
deba@1699
   127
    }
deba@1699
   128
deba@1699
   129
    /// \brief The type of the map that stores the dists of the nodes.
deba@1699
   130
    ///
deba@1699
   131
    /// The type of the map that stores the dists of the nodes.
deba@1723
   132
    /// It must meet the \ref concept::WriteMatrixMap "WriteMatrixMap" concept.
deba@1699
   133
    ///
deba@1723
   134
    typedef DynamicMatrixMap<Graph, typename Graph::Node, Value> DistMap;
deba@1699
   135
deba@1699
   136
    /// \brief Instantiates a DistMap.
deba@1699
   137
    ///
deba@1699
   138
    /// This function instantiates a \ref DistMap. 
alpar@1946
   139
    /// \param graph is the graph, to which we would like to define the 
deba@1699
   140
    /// \ref DistMap
deba@1699
   141
    static DistMap *createDistMap(const _Graph& graph) {
deba@1699
   142
      return new DistMap(graph);
deba@1699
   143
    }
deba@1699
   144
deba@1699
   145
  };
deba@1699
   146
  
deba@1754
   147
  /// \brief %FloydWarshall algorithm class.
deba@1699
   148
  ///
deba@1699
   149
  /// \ingroup flowalgs
deba@1754
   150
  /// This class provides an efficient implementation of \c Floyd-Warshall 
deba@1699
   151
  /// algorithm. The edge lengths are passed to the algorithm using a
deba@1699
   152
  /// \ref concept::ReadMap "ReadMap", so it is easy to change it to any 
deba@1699
   153
  /// kind of length.
deba@1699
   154
  ///
alpar@1757
   155
  /// The algorithm solves the shortest path problem for each pair
deba@1723
   156
  /// of node when the edges can have negative length but the graph should
deba@1754
   157
  /// not contain cycles with negative sum of length. If we can assume
deba@1723
   158
  /// that all edge is non-negative in the graph then the dijkstra algorithm
deba@1723
   159
  /// should be used from each node rather and if the graph is sparse and
deba@1754
   160
  /// there are negative circles then the johnson algorithm.
deba@1723
   161
  ///
deba@2042
   162
  /// The complexity of this algorithm is \f$ O(n^3+e) \f$.
deba@1723
   163
  ///
deba@1699
   164
  /// The type of the length is determined by the
deba@1699
   165
  /// \ref concept::ReadMap::Value "Value" of the length map.
deba@1699
   166
  ///
deba@1699
   167
  /// \param _Graph The graph type the algorithm runs on. The default value
deba@1699
   168
  /// is \ref ListGraph. The value of _Graph is not used directly by
deba@1699
   169
  /// FloydWarshall, it is only passed to \ref FloydWarshallDefaultTraits.
deba@1699
   170
  /// \param _LengthMap This read-only EdgeMap determines the lengths of the
deba@1699
   171
  /// edges. It is read once for each edge, so the map may involve in
deba@1699
   172
  /// relatively time consuming process to compute the edge length if
deba@1699
   173
  /// it is necessary. The default map type is \ref
deba@2111
   174
  /// concept::Graph::EdgeMap "Graph::EdgeMap<int>".  The value
deba@1699
   175
  /// of _LengthMap is not used directly by FloydWarshall, it is only passed 
deba@1699
   176
  /// to \ref FloydWarshallDefaultTraits.  \param _Traits Traits class to set
deba@1699
   177
  /// various data types used by the algorithm.  The default traits
deba@1699
   178
  /// class is \ref FloydWarshallDefaultTraits
deba@1699
   179
  /// "FloydWarshallDefaultTraits<_Graph,_LengthMap>".  See \ref
deba@1699
   180
  /// FloydWarshallDefaultTraits for the documentation of a FloydWarshall 
deba@1699
   181
  /// traits class.
deba@1699
   182
  ///
deba@1699
   183
  /// \author Balazs Dezso
alpar@2184
   184
  /// \todo A function type interface would be nice.
alpar@2184
   185
  /// \todo Implement \c nextNode() and \c nextEdge()
deba@1710
   186
#ifdef DOXYGEN
alpar@2184
   187
  template <typename _Graph, typename _LengthMap, typename _Traits >
deba@1710
   188
#else
deba@1699
   189
  template <typename _Graph=ListGraph,
deba@1699
   190
	    typename _LengthMap=typename _Graph::template EdgeMap<int>,
deba@1699
   191
	    typename _Traits=FloydWarshallDefaultTraits<_Graph,_LengthMap> >
deba@1710
   192
#endif
deba@1699
   193
  class FloydWarshall {
deba@1699
   194
  public:
deba@1699
   195
    
deba@1699
   196
    /// \brief \ref Exception for uninitialized parameters.
deba@1699
   197
    ///
deba@1699
   198
    /// This error represents problems in the initialization
deba@1699
   199
    /// of the parameters of the algorithms.
deba@1699
   200
deba@1699
   201
    class UninitializedParameter : public lemon::UninitializedParameter {
deba@1699
   202
    public:
alpar@2151
   203
      virtual const char* what() const throw() {
deba@1699
   204
	return "lemon::FloydWarshall::UninitializedParameter";
deba@1699
   205
      }
deba@1699
   206
    };
deba@1699
   207
deba@1699
   208
    typedef _Traits Traits;
deba@1699
   209
    ///The type of the underlying graph.
deba@1699
   210
    typedef typename _Traits::Graph Graph;
deba@1699
   211
deba@1699
   212
    typedef typename Graph::Node Node;
deba@1699
   213
    typedef typename Graph::NodeIt NodeIt;
deba@1699
   214
    typedef typename Graph::Edge Edge;
deba@1699
   215
    typedef typename Graph::EdgeIt EdgeIt;
deba@1699
   216
    
deba@1699
   217
    /// \brief The type of the length of the edges.
deba@1699
   218
    typedef typename _Traits::LengthMap::Value Value;
deba@1699
   219
    /// \brief The type of the map that stores the edge lengths.
deba@1699
   220
    typedef typename _Traits::LengthMap LengthMap;
deba@1699
   221
    /// \brief The type of the map that stores the last
deba@1699
   222
    /// edges of the shortest paths. The type of the PredMap
deba@1699
   223
    /// is a matrix map for Edges
deba@1699
   224
    typedef typename _Traits::PredMap PredMap;
deba@1699
   225
    /// \brief The type of the map that stores the dists of the nodes.
deba@1699
   226
    /// The type of the DistMap is a matrix map for Values
alpar@2184
   227
    ///
alpar@2184
   228
    /// \todo It should rather be
alpar@2184
   229
    /// called \c DistMatrix
deba@1699
   230
    typedef typename _Traits::DistMap DistMap;
deba@1699
   231
    /// \brief The operation traits.
deba@1699
   232
    typedef typename _Traits::OperationTraits OperationTraits;
deba@1699
   233
  private:
deba@1699
   234
    /// Pointer to the underlying graph.
deba@1699
   235
    const Graph *graph;
deba@1699
   236
    /// Pointer to the length map
deba@1699
   237
    const LengthMap *length;
deba@1699
   238
    ///Pointer to the map of predecessors edges.
deba@1699
   239
    PredMap *_pred;
deba@1699
   240
    ///Indicates if \ref _pred is locally allocated (\c true) or not.
deba@1699
   241
    bool local_pred;
deba@1699
   242
    ///Pointer to the map of distances.
deba@1699
   243
    DistMap *_dist;
deba@1699
   244
    ///Indicates if \ref _dist is locally allocated (\c true) or not.
deba@1699
   245
    bool local_dist;
deba@1699
   246
deba@1699
   247
    /// Creates the maps if necessary.
deba@1699
   248
    void create_maps() {
deba@1699
   249
      if(!_pred) {
deba@1699
   250
	local_pred = true;
deba@1699
   251
	_pred = Traits::createPredMap(*graph);
deba@1699
   252
      }
deba@1699
   253
      if(!_dist) {
deba@1699
   254
	local_dist = true;
deba@1699
   255
	_dist = Traits::createDistMap(*graph);
deba@1699
   256
      }
deba@1699
   257
    }
deba@1699
   258
    
deba@1699
   259
  public :
deba@1699
   260
 
deba@1699
   261
    /// \name Named template parameters
deba@1699
   262
deba@1699
   263
    ///@{
deba@1699
   264
deba@1699
   265
    template <class T>
deba@1699
   266
    struct DefPredMapTraits : public Traits {
deba@1699
   267
      typedef T PredMap;
deba@1699
   268
      static PredMap *createPredMap(const Graph& graph) {
deba@1699
   269
	throw UninitializedParameter();
deba@1699
   270
      }
deba@1699
   271
    };
deba@1699
   272
deba@1699
   273
    /// \brief \ref named-templ-param "Named parameter" for setting PredMap 
deba@1699
   274
    /// type
deba@1699
   275
    /// \ref named-templ-param "Named parameter" for setting PredMap type
deba@1699
   276
    ///
deba@1699
   277
    template <class T>
deba@1710
   278
    struct DefPredMap 
deba@1710
   279
      : public FloydWarshall< Graph, LengthMap, DefPredMapTraits<T> > {
deba@1710
   280
      typedef FloydWarshall< Graph, LengthMap, DefPredMapTraits<T> > Create;
deba@1710
   281
    };
deba@1699
   282
    
deba@1699
   283
    template <class T>
deba@1699
   284
    struct DefDistMapTraits : public Traits {
deba@1699
   285
      typedef T DistMap;
deba@1699
   286
      static DistMap *createDistMap(const Graph& graph) {
deba@1699
   287
	throw UninitializedParameter();
deba@1699
   288
      }
deba@1699
   289
    };
deba@1699
   290
    /// \brief \ref named-templ-param "Named parameter" for setting DistMap 
deba@1699
   291
    /// type
deba@1699
   292
    ///
deba@1699
   293
    /// \ref named-templ-param "Named parameter" for setting DistMap type
deba@1699
   294
    ///
deba@1699
   295
    template <class T>
deba@1710
   296
    struct DefDistMap 
deba@1710
   297
      : public FloydWarshall< Graph, LengthMap, DefDistMapTraits<T> > {
deba@1710
   298
      typedef FloydWarshall< Graph, LengthMap, DefDistMapTraits<T> > Create;
deba@1710
   299
    };
deba@1699
   300
    
deba@1699
   301
    template <class T>
deba@1699
   302
    struct DefOperationTraitsTraits : public Traits {
deba@1699
   303
      typedef T OperationTraits;
deba@1699
   304
    };
deba@1699
   305
    
deba@1699
   306
    /// \brief \ref named-templ-param "Named parameter" for setting 
deba@1699
   307
    /// OperationTraits type
deba@1699
   308
    ///
deba@1699
   309
    /// \ref named-templ-param "Named parameter" for setting PredMap type
deba@1699
   310
    template <class T>
deba@1710
   311
    struct DefOperationTraits
deba@1699
   312
      : public FloydWarshall< Graph, LengthMap, DefOperationTraitsTraits<T> > {
deba@1710
   313
      typedef FloydWarshall< Graph, LengthMap, DefOperationTraitsTraits<T> >
deba@1710
   314
      Create;
deba@1699
   315
    };
deba@1699
   316
    
deba@1699
   317
    ///@}
deba@1699
   318
deba@1710
   319
  protected:
deba@1710
   320
deba@1710
   321
    FloydWarshall() {}
deba@1710
   322
deba@1699
   323
  public:      
deba@1710
   324
deba@1710
   325
    typedef FloydWarshall Create;
deba@1699
   326
    
deba@1699
   327
    /// \brief Constructor.
deba@1699
   328
    ///
deba@1699
   329
    /// \param _graph the graph the algorithm will run on.
deba@1699
   330
    /// \param _length the length map used by the algorithm.
deba@1699
   331
    FloydWarshall(const Graph& _graph, const LengthMap& _length) :
deba@1699
   332
      graph(&_graph), length(&_length),
deba@1699
   333
      _pred(0), local_pred(false),
deba@1699
   334
      _dist(0), local_dist(false) {}
deba@1699
   335
    
deba@1699
   336
    ///Destructor.
deba@1699
   337
    ~FloydWarshall() {
deba@1699
   338
      if(local_pred) delete _pred;
deba@1699
   339
      if(local_dist) delete _dist;
deba@1699
   340
    }
deba@1699
   341
deba@1699
   342
    /// \brief Sets the length map.
deba@1699
   343
    ///
deba@1699
   344
    /// Sets the length map.
deba@1699
   345
    /// \return \c (*this)
deba@1699
   346
    FloydWarshall &lengthMap(const LengthMap &m) {
deba@1699
   347
      length = &m;
deba@1699
   348
      return *this;
deba@1699
   349
    }
deba@1699
   350
deba@1699
   351
    /// \brief Sets the map storing the predecessor edges.
deba@1699
   352
    ///
deba@1699
   353
    /// Sets the map storing the predecessor edges.
deba@1699
   354
    /// If you don't use this function before calling \ref run(),
deba@1699
   355
    /// it will allocate one. The destuctor deallocates this
deba@1699
   356
    /// automatically allocated map, of course.
deba@1699
   357
    /// \return \c (*this)
deba@1699
   358
    FloydWarshall &predMap(PredMap &m) {
deba@1699
   359
      if(local_pred) {
deba@1699
   360
	delete _pred;
deba@1699
   361
	local_pred=false;
deba@1699
   362
      }
deba@1699
   363
      _pred = &m;
deba@1699
   364
      return *this;
deba@1699
   365
    }
deba@1699
   366
deba@1699
   367
    /// \brief Sets the map storing the distances calculated by the algorithm.
deba@1699
   368
    ///
deba@1699
   369
    /// Sets the map storing the distances calculated by the algorithm.
deba@1699
   370
    /// If you don't use this function before calling \ref run(),
deba@1699
   371
    /// it will allocate one. The destuctor deallocates this
deba@1699
   372
    /// automatically allocated map, of course.
deba@1699
   373
    /// \return \c (*this)
deba@1699
   374
    FloydWarshall &distMap(DistMap &m) {
deba@1699
   375
      if(local_dist) {
deba@1699
   376
	delete _dist;
deba@1699
   377
	local_dist=false;
deba@1699
   378
      }
deba@1699
   379
      _dist = &m;
deba@1699
   380
      return *this;
deba@1699
   381
    }
deba@1699
   382
deba@1699
   383
    ///\name Execution control
deba@1699
   384
    /// The simplest way to execute the algorithm is to use
deba@1699
   385
    /// one of the member functions called \c run(...).
deba@1699
   386
    /// \n
deba@1699
   387
    /// If you need more control on the execution,
deba@1699
   388
    /// Finally \ref start() will perform the actual path
deba@1699
   389
    /// computation.
deba@1699
   390
deba@1699
   391
    ///@{
deba@1699
   392
deba@1699
   393
    /// \brief Initializes the internal data structures.
deba@1699
   394
    /// 
deba@1699
   395
    /// Initializes the internal data structures.
deba@1699
   396
    void init() {
deba@1699
   397
      create_maps();
deba@1699
   398
      for (NodeIt it(*graph); it != INVALID; ++it) {
deba@1699
   399
	for (NodeIt jt(*graph); jt != INVALID; ++jt) {
deba@1699
   400
	  _pred->set(it, jt, INVALID);
deba@1741
   401
	  _dist->set(it, jt, OperationTraits::infinity());
deba@1699
   402
	}
deba@1741
   403
	_dist->set(it, it, OperationTraits::zero());
deba@1699
   404
      }
deba@1699
   405
      for (EdgeIt it(*graph); it != INVALID; ++it) {
deba@1699
   406
	Node source = graph->source(it);
deba@1699
   407
	Node target = graph->target(it);	
deba@1699
   408
	if (OperationTraits::less((*length)[it], (*_dist)(source, target))) {
deba@1699
   409
	  _dist->set(source, target, (*length)[it]);
deba@1699
   410
	  _pred->set(source, target, it);
deba@1699
   411
	}
deba@1699
   412
      }
deba@1699
   413
    }
deba@1699
   414
    
deba@1699
   415
    /// \brief Executes the algorithm.
deba@1699
   416
    ///
deba@1699
   417
    /// This method runs the %FloydWarshall algorithm in order to compute 
deba@1699
   418
    /// the shortest path to each node pairs. The algorithm 
deba@1699
   419
    /// computes 
deba@1699
   420
    /// - The shortest path tree for each node.
deba@1699
   421
    /// - The distance between each node pairs.
deba@1699
   422
    void start() {
deba@1699
   423
      for (NodeIt kt(*graph); kt != INVALID; ++kt) {
deba@1699
   424
	for (NodeIt it(*graph); it != INVALID; ++it) {
deba@1699
   425
	  for (NodeIt jt(*graph); jt != INVALID; ++jt) {
deba@1699
   426
	    Value relaxed = OperationTraits::plus((*_dist)(it, kt),
deba@1699
   427
						  (*_dist)(kt, jt));
deba@1699
   428
	    if (OperationTraits::less(relaxed, (*_dist)(it, jt))) {
deba@1699
   429
	      _dist->set(it, jt, relaxed);
deba@1699
   430
	      _pred->set(it, jt, (*_pred)(kt, jt));
deba@1699
   431
	    }
deba@1699
   432
	  }
deba@1699
   433
	}
deba@1699
   434
      }
deba@1699
   435
    }
deba@1741
   436
deba@1754
   437
    /// \brief Executes the algorithm and checks the negative cycles.
deba@1741
   438
    ///
deba@1741
   439
    /// This method runs the %FloydWarshall algorithm in order to compute 
deba@1754
   440
    /// the shortest path to each node pairs. If there is a negative cycle 
deba@1741
   441
    /// in the graph it gives back false. 
deba@1741
   442
    /// The algorithm computes 
deba@1741
   443
    /// - The shortest path tree for each node.
deba@1741
   444
    /// - The distance between each node pairs.
deba@1741
   445
    bool checkedStart() {
deba@1741
   446
      start();
deba@1741
   447
      for (NodeIt it(*graph); it != INVALID; ++it) {
deba@1741
   448
	if (OperationTraits::less((*dist)(it, it), OperationTraits::zero())) {
deba@1741
   449
	  return false;
deba@1741
   450
	}
deba@1741
   451
      }
deba@1741
   452
      return true;
deba@1741
   453
    }
deba@1699
   454
    
deba@1699
   455
    /// \brief Runs %FloydWarshall algorithm.
deba@1699
   456
    ///    
deba@1699
   457
    /// This method runs the %FloydWarshall algorithm from a each node
deba@1699
   458
    /// in order to compute the shortest path to each node pairs. 
deba@1699
   459
    /// The algorithm computes
deba@1699
   460
    /// - The shortest path tree for each node.
deba@1699
   461
    /// - The distance between each node pairs.
deba@1699
   462
    ///
deba@1699
   463
    /// \note d.run(s) is just a shortcut of the following code.
alpar@1946
   464
    ///\code
deba@1699
   465
    ///  d.init();
deba@1699
   466
    ///  d.start();
alpar@1946
   467
    ///\endcode
deba@1699
   468
    void run() {
deba@1699
   469
      init();
deba@1699
   470
      start();
deba@1699
   471
    }
deba@1699
   472
    
deba@1699
   473
    ///@}
deba@1699
   474
deba@1699
   475
    /// \name Query Functions
deba@1699
   476
    /// The result of the %FloydWarshall algorithm can be obtained using these
deba@1699
   477
    /// functions.\n
deba@1699
   478
    /// Before the use of these functions,
deba@1699
   479
    /// either run() or start() must be called.
deba@1699
   480
    
deba@1699
   481
    ///@{
deba@1699
   482
deba@1699
   483
    /// \brief Copies the shortest path to \c t into \c p
deba@1699
   484
    ///    
deba@1699
   485
    /// This function copies the shortest path to \c t into \c p.
deba@1699
   486
    /// If it \c t is a source itself or unreachable, then it does not
deba@1699
   487
    /// alter \c p.
deba@1699
   488
    /// \return Returns \c true if a path to \c t was actually copied to \c p,
deba@1699
   489
    /// \c false otherwise.
deba@1699
   490
    /// \sa DirPath
deba@1699
   491
    template <typename Path>
deba@1699
   492
    bool getPath(Path &p, Node source, Node target) {
deba@1699
   493
      if (connected(source, target)) {
deba@1699
   494
	p.clear();
deba@1699
   495
	typename Path::Builder b(target);
deba@1763
   496
	for(b.setStartNode(target); predEdge(source, target) != INVALID;
deba@1699
   497
	    target = predNode(target)) {
deba@1763
   498
	  b.pushFront(predEdge(source, target));
deba@1699
   499
	}
deba@1699
   500
	b.commit();
deba@1699
   501
	return true;
deba@1699
   502
      }
deba@1699
   503
      return false;
deba@1699
   504
    }
deba@1699
   505
	  
deba@1699
   506
    /// \brief The distance between two nodes.
deba@1699
   507
    ///
deba@1699
   508
    /// Returns the distance between two nodes.
deba@1699
   509
    /// \pre \ref run() must be called before using this function.
deba@1699
   510
    /// \warning If node \c v in unreachable from the root the return value
deba@1699
   511
    /// of this funcion is undefined.
deba@1699
   512
    Value dist(Node source, Node target) const { 
deba@1699
   513
      return (*_dist)(source, target); 
deba@1699
   514
    }
deba@1699
   515
deba@1699
   516
    /// \brief Returns the 'previous edge' of the shortest path tree.
deba@1699
   517
    ///
deba@1699
   518
    /// For the node \c node it returns the 'previous edge' of the shortest 
deba@1699
   519
    /// path tree to direction of the node \c root 
deba@1699
   520
    /// i.e. it returns the last edge of a shortest path from the node \c root 
deba@1699
   521
    /// to \c node. It is \ref INVALID if \c node is unreachable from the root
deba@1699
   522
    /// or if \c node=root. The shortest path tree used here is equal to the 
deba@1699
   523
    /// shortest path tree used in \ref predNode(). 
deba@1699
   524
    /// \pre \ref run() must be called before using this function.
deba@1763
   525
    Edge predEdge(Node root, Node node) const { 
deba@1699
   526
      return (*_pred)(root, node); 
deba@1699
   527
    }
deba@1699
   528
deba@1699
   529
    /// \brief Returns the 'previous node' of the shortest path tree.
deba@1699
   530
    ///
deba@1699
   531
    /// For a node \c node it returns the 'previous node' of the shortest path 
deba@1699
   532
    /// tree to direction of the node \c root, i.e. it returns the last but 
deba@1699
   533
    /// one node from a shortest path from the \c root to \c node. It is 
deba@1699
   534
    /// INVALID if \c node is unreachable from the root or if \c node=root. 
deba@1699
   535
    /// The shortest path tree used here is equal to the 
deba@1763
   536
    /// shortest path tree used in \ref predEdge().  
deba@1699
   537
    /// \pre \ref run() must be called before using this function.
deba@1699
   538
    Node predNode(Node root, Node node) const { 
deba@1699
   539
      return (*_pred)(root, node) == INVALID ? 
deba@1699
   540
      INVALID : graph->source((*_pred)(root, node)); 
deba@1699
   541
    }
deba@1699
   542
    
deba@1699
   543
    /// \brief Returns a reference to the matrix node map of distances.
deba@1699
   544
    ///
deba@1699
   545
    /// Returns a reference to the matrix node map of distances. 
deba@1699
   546
    ///
deba@1699
   547
    /// \pre \ref run() must be called before using this function.
deba@1699
   548
    const DistMap &distMap() const { return *_dist;}
deba@1699
   549
 
deba@1699
   550
    /// \brief Returns a reference to the shortest path tree map.
deba@1699
   551
    ///
deba@1699
   552
    /// Returns a reference to the matrix node map of the edges of the
deba@1699
   553
    /// shortest path tree.
deba@1699
   554
    /// \pre \ref run() must be called before using this function.
deba@1699
   555
    const PredMap &predMap() const { return *_pred;}
deba@1699
   556
 
deba@1699
   557
    /// \brief Checks if a node is reachable from the root.
deba@1699
   558
    ///
deba@1699
   559
    /// Returns \c true if \c v is reachable from the root.
deba@1699
   560
    /// \pre \ref run() must be called before using this function.
deba@1699
   561
    ///
deba@1699
   562
    bool connected(Node source, Node target) { 
deba@1699
   563
      return (*_dist)(source, target) != OperationTraits::infinity(); 
deba@1699
   564
    }
deba@1699
   565
    
deba@1699
   566
    ///@}
deba@1699
   567
  };
deba@1699
   568
 
deba@1699
   569
} //END OF NAMESPACE LEMON
deba@1699
   570
deba@1699
   571
#endif
deba@1699
   572