lemon/floyd_warshall.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_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@1699
    29
#include <lemon/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@1723
   162
  /// The complexity of this algorithm is O(n^3 + e).
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@1699
   174
  /// concept::StaticGraph::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
deba@1699
   184
deba@1710
   185
#ifdef DOXYGEN
deba@1710
   186
  template <typename _Graph, typename _LengthMap typename _Traits >
deba@1710
   187
#else
deba@1699
   188
  template <typename _Graph=ListGraph,
deba@1699
   189
	    typename _LengthMap=typename _Graph::template EdgeMap<int>,
deba@1699
   190
	    typename _Traits=FloydWarshallDefaultTraits<_Graph,_LengthMap> >
deba@1710
   191
#endif
deba@1699
   192
  class FloydWarshall {
deba@1699
   193
  public:
deba@1699
   194
    
deba@1699
   195
    /// \brief \ref Exception for uninitialized parameters.
deba@1699
   196
    ///
deba@1699
   197
    /// This error represents problems in the initialization
deba@1699
   198
    /// of the parameters of the algorithms.
deba@1699
   199
deba@1699
   200
    class UninitializedParameter : public lemon::UninitializedParameter {
deba@1699
   201
    public:
deba@1699
   202
      virtual const char* exceptionName() const {
deba@1699
   203
	return "lemon::FloydWarshall::UninitializedParameter";
deba@1699
   204
      }
deba@1699
   205
    };
deba@1699
   206
deba@1699
   207
    typedef _Traits Traits;
deba@1699
   208
    ///The type of the underlying graph.
deba@1699
   209
    typedef typename _Traits::Graph Graph;
deba@1699
   210
deba@1699
   211
    typedef typename Graph::Node Node;
deba@1699
   212
    typedef typename Graph::NodeIt NodeIt;
deba@1699
   213
    typedef typename Graph::Edge Edge;
deba@1699
   214
    typedef typename Graph::EdgeIt EdgeIt;
deba@1699
   215
    
deba@1699
   216
    /// \brief The type of the length of the edges.
deba@1699
   217
    typedef typename _Traits::LengthMap::Value Value;
deba@1699
   218
    /// \brief The type of the map that stores the edge lengths.
deba@1699
   219
    typedef typename _Traits::LengthMap LengthMap;
deba@1699
   220
    /// \brief The type of the map that stores the last
deba@1699
   221
    /// edges of the shortest paths. The type of the PredMap
deba@1699
   222
    /// is a matrix map for Edges
deba@1699
   223
    typedef typename _Traits::PredMap PredMap;
deba@1699
   224
    /// \brief The type of the map that stores the dists of the nodes.
deba@1699
   225
    /// The type of the DistMap is a matrix map for Values
deba@1699
   226
    typedef typename _Traits::DistMap DistMap;
deba@1699
   227
    /// \brief The operation traits.
deba@1699
   228
    typedef typename _Traits::OperationTraits OperationTraits;
deba@1699
   229
  private:
deba@1699
   230
    /// Pointer to the underlying graph.
deba@1699
   231
    const Graph *graph;
deba@1699
   232
    /// Pointer to the length map
deba@1699
   233
    const LengthMap *length;
deba@1699
   234
    ///Pointer to the map of predecessors edges.
deba@1699
   235
    PredMap *_pred;
deba@1699
   236
    ///Indicates if \ref _pred is locally allocated (\c true) or not.
deba@1699
   237
    bool local_pred;
deba@1699
   238
    ///Pointer to the map of distances.
deba@1699
   239
    DistMap *_dist;
deba@1699
   240
    ///Indicates if \ref _dist is locally allocated (\c true) or not.
deba@1699
   241
    bool local_dist;
deba@1699
   242
deba@1699
   243
    /// Creates the maps if necessary.
deba@1699
   244
    void create_maps() {
deba@1699
   245
      if(!_pred) {
deba@1699
   246
	local_pred = true;
deba@1699
   247
	_pred = Traits::createPredMap(*graph);
deba@1699
   248
      }
deba@1699
   249
      if(!_dist) {
deba@1699
   250
	local_dist = true;
deba@1699
   251
	_dist = Traits::createDistMap(*graph);
deba@1699
   252
      }
deba@1699
   253
    }
deba@1699
   254
    
deba@1699
   255
  public :
deba@1699
   256
 
deba@1699
   257
    /// \name Named template parameters
deba@1699
   258
deba@1699
   259
    ///@{
deba@1699
   260
deba@1699
   261
    template <class T>
deba@1699
   262
    struct DefPredMapTraits : public Traits {
deba@1699
   263
      typedef T PredMap;
deba@1699
   264
      static PredMap *createPredMap(const Graph& graph) {
deba@1699
   265
	throw UninitializedParameter();
deba@1699
   266
      }
deba@1699
   267
    };
deba@1699
   268
deba@1699
   269
    /// \brief \ref named-templ-param "Named parameter" for setting PredMap 
deba@1699
   270
    /// type
deba@1699
   271
    /// \ref named-templ-param "Named parameter" for setting PredMap type
deba@1699
   272
    ///
deba@1699
   273
    template <class T>
deba@1710
   274
    struct DefPredMap 
deba@1710
   275
      : public FloydWarshall< Graph, LengthMap, DefPredMapTraits<T> > {
deba@1710
   276
      typedef FloydWarshall< Graph, LengthMap, DefPredMapTraits<T> > Create;
deba@1710
   277
    };
deba@1699
   278
    
deba@1699
   279
    template <class T>
deba@1699
   280
    struct DefDistMapTraits : public Traits {
deba@1699
   281
      typedef T DistMap;
deba@1699
   282
      static DistMap *createDistMap(const Graph& graph) {
deba@1699
   283
	throw UninitializedParameter();
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@1710
   293
      : public FloydWarshall< Graph, LengthMap, DefDistMapTraits<T> > {
deba@1710
   294
      typedef FloydWarshall< 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@1699
   305
    /// \ref named-templ-param "Named parameter" for setting PredMap type
deba@1699
   306
    template <class T>
deba@1710
   307
    struct DefOperationTraits
deba@1699
   308
      : public FloydWarshall< Graph, LengthMap, DefOperationTraitsTraits<T> > {
deba@1710
   309
      typedef FloydWarshall< Graph, LengthMap, DefOperationTraitsTraits<T> >
deba@1710
   310
      Create;
deba@1699
   311
    };
deba@1699
   312
    
deba@1699
   313
    ///@}
deba@1699
   314
deba@1710
   315
  protected:
deba@1710
   316
deba@1710
   317
    FloydWarshall() {}
deba@1710
   318
deba@1699
   319
  public:      
deba@1710
   320
deba@1710
   321
    typedef FloydWarshall Create;
deba@1699
   322
    
deba@1699
   323
    /// \brief Constructor.
deba@1699
   324
    ///
deba@1699
   325
    /// \param _graph the graph the algorithm will run on.
deba@1699
   326
    /// \param _length the length map used by the algorithm.
deba@1699
   327
    FloydWarshall(const Graph& _graph, const LengthMap& _length) :
deba@1699
   328
      graph(&_graph), length(&_length),
deba@1699
   329
      _pred(0), local_pred(false),
deba@1699
   330
      _dist(0), local_dist(false) {}
deba@1699
   331
    
deba@1699
   332
    ///Destructor.
deba@1699
   333
    ~FloydWarshall() {
deba@1699
   334
      if(local_pred) delete _pred;
deba@1699
   335
      if(local_dist) delete _dist;
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@1699
   342
    FloydWarshall &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@1699
   354
    FloydWarshall &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@1699
   370
    FloydWarshall &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
    /// Finally \ref start() will perform the actual path
deba@1699
   385
    /// computation.
deba@1699
   386
deba@1699
   387
    ///@{
deba@1699
   388
deba@1699
   389
    /// \brief Initializes the internal data structures.
deba@1699
   390
    /// 
deba@1699
   391
    /// Initializes the internal data structures.
deba@1699
   392
    void init() {
deba@1699
   393
      create_maps();
deba@1699
   394
      for (NodeIt it(*graph); it != INVALID; ++it) {
deba@1699
   395
	for (NodeIt jt(*graph); jt != INVALID; ++jt) {
deba@1699
   396
	  _pred->set(it, jt, INVALID);
deba@1741
   397
	  _dist->set(it, jt, OperationTraits::infinity());
deba@1699
   398
	}
deba@1741
   399
	_dist->set(it, it, OperationTraits::zero());
deba@1699
   400
      }
deba@1699
   401
      for (EdgeIt it(*graph); it != INVALID; ++it) {
deba@1699
   402
	Node source = graph->source(it);
deba@1699
   403
	Node target = graph->target(it);	
deba@1699
   404
	if (OperationTraits::less((*length)[it], (*_dist)(source, target))) {
deba@1699
   405
	  _dist->set(source, target, (*length)[it]);
deba@1699
   406
	  _pred->set(source, target, it);
deba@1699
   407
	}
deba@1699
   408
      }
deba@1699
   409
    }
deba@1699
   410
    
deba@1699
   411
    /// \brief Executes the algorithm.
deba@1699
   412
    ///
deba@1699
   413
    /// This method runs the %FloydWarshall algorithm in order to compute 
deba@1699
   414
    /// the shortest path to each node pairs. The algorithm 
deba@1699
   415
    /// computes 
deba@1699
   416
    /// - The shortest path tree for each node.
deba@1699
   417
    /// - The distance between each node pairs.
deba@1699
   418
    void start() {
deba@1699
   419
      for (NodeIt kt(*graph); kt != INVALID; ++kt) {
deba@1699
   420
	for (NodeIt it(*graph); it != INVALID; ++it) {
deba@1699
   421
	  for (NodeIt jt(*graph); jt != INVALID; ++jt) {
deba@1699
   422
	    Value relaxed = OperationTraits::plus((*_dist)(it, kt),
deba@1699
   423
						  (*_dist)(kt, jt));
deba@1699
   424
	    if (OperationTraits::less(relaxed, (*_dist)(it, jt))) {
deba@1699
   425
	      _dist->set(it, jt, relaxed);
deba@1699
   426
	      _pred->set(it, jt, (*_pred)(kt, jt));
deba@1699
   427
	    }
deba@1699
   428
	  }
deba@1699
   429
	}
deba@1699
   430
      }
deba@1699
   431
    }
deba@1741
   432
deba@1754
   433
    /// \brief Executes the algorithm and checks the negative cycles.
deba@1741
   434
    ///
deba@1741
   435
    /// This method runs the %FloydWarshall algorithm in order to compute 
deba@1754
   436
    /// the shortest path to each node pairs. If there is a negative cycle 
deba@1741
   437
    /// in the graph it gives back false. 
deba@1741
   438
    /// The algorithm computes 
deba@1741
   439
    /// - The shortest path tree for each node.
deba@1741
   440
    /// - The distance between each node pairs.
deba@1741
   441
    bool checkedStart() {
deba@1741
   442
      start();
deba@1741
   443
      for (NodeIt it(*graph); it != INVALID; ++it) {
deba@1741
   444
	if (OperationTraits::less((*dist)(it, it), OperationTraits::zero())) {
deba@1741
   445
	  return false;
deba@1741
   446
	}
deba@1741
   447
      }
deba@1741
   448
      return true;
deba@1741
   449
    }
deba@1699
   450
    
deba@1699
   451
    /// \brief Runs %FloydWarshall algorithm.
deba@1699
   452
    ///    
deba@1699
   453
    /// This method runs the %FloydWarshall algorithm from a each node
deba@1699
   454
    /// in order to compute the shortest path to each node pairs. 
deba@1699
   455
    /// The algorithm computes
deba@1699
   456
    /// - The shortest path tree for each node.
deba@1699
   457
    /// - The distance between each node pairs.
deba@1699
   458
    ///
deba@1699
   459
    /// \note d.run(s) is just a shortcut of the following code.
alpar@1946
   460
    ///\code
deba@1699
   461
    ///  d.init();
deba@1699
   462
    ///  d.start();
alpar@1946
   463
    ///\endcode
deba@1699
   464
    void run() {
deba@1699
   465
      init();
deba@1699
   466
      start();
deba@1699
   467
    }
deba@1699
   468
    
deba@1699
   469
    ///@}
deba@1699
   470
deba@1699
   471
    /// \name Query Functions
deba@1699
   472
    /// The result of the %FloydWarshall algorithm can be obtained using these
deba@1699
   473
    /// functions.\n
deba@1699
   474
    /// Before the use of these functions,
deba@1699
   475
    /// either run() or start() must be called.
deba@1699
   476
    
deba@1699
   477
    ///@{
deba@1699
   478
deba@1699
   479
    /// \brief Copies the shortest path to \c t into \c p
deba@1699
   480
    ///    
deba@1699
   481
    /// This function copies the shortest path to \c t into \c p.
deba@1699
   482
    /// If it \c t is a source itself or unreachable, then it does not
deba@1699
   483
    /// alter \c p.
deba@1699
   484
    /// \return Returns \c true if a path to \c t was actually copied to \c p,
deba@1699
   485
    /// \c false otherwise.
deba@1699
   486
    /// \sa DirPath
deba@1699
   487
    template <typename Path>
deba@1699
   488
    bool getPath(Path &p, Node source, Node target) {
deba@1699
   489
      if (connected(source, target)) {
deba@1699
   490
	p.clear();
deba@1699
   491
	typename Path::Builder b(target);
deba@1763
   492
	for(b.setStartNode(target); predEdge(source, target) != INVALID;
deba@1699
   493
	    target = predNode(target)) {
deba@1763
   494
	  b.pushFront(predEdge(source, target));
deba@1699
   495
	}
deba@1699
   496
	b.commit();
deba@1699
   497
	return true;
deba@1699
   498
      }
deba@1699
   499
      return false;
deba@1699
   500
    }
deba@1699
   501
	  
deba@1699
   502
    /// \brief The distance between two nodes.
deba@1699
   503
    ///
deba@1699
   504
    /// Returns the distance between two nodes.
deba@1699
   505
    /// \pre \ref run() must be called before using this function.
deba@1699
   506
    /// \warning If node \c v in unreachable from the root the return value
deba@1699
   507
    /// of this funcion is undefined.
deba@1699
   508
    Value dist(Node source, Node target) const { 
deba@1699
   509
      return (*_dist)(source, target); 
deba@1699
   510
    }
deba@1699
   511
deba@1699
   512
    /// \brief Returns the 'previous edge' of the shortest path tree.
deba@1699
   513
    ///
deba@1699
   514
    /// For the node \c node it returns the 'previous edge' of the shortest 
deba@1699
   515
    /// path tree to direction of the node \c root 
deba@1699
   516
    /// i.e. it returns the last edge of a shortest path from the node \c root 
deba@1699
   517
    /// to \c node. It is \ref INVALID if \c node is unreachable from the root
deba@1699
   518
    /// or if \c node=root. The shortest path tree used here is equal to the 
deba@1699
   519
    /// shortest path tree used in \ref predNode(). 
deba@1699
   520
    /// \pre \ref run() must be called before using this function.
deba@1763
   521
    Edge predEdge(Node root, Node node) const { 
deba@1699
   522
      return (*_pred)(root, node); 
deba@1699
   523
    }
deba@1699
   524
deba@1699
   525
    /// \brief Returns the 'previous node' of the shortest path tree.
deba@1699
   526
    ///
deba@1699
   527
    /// For a node \c node it returns the 'previous node' of the shortest path 
deba@1699
   528
    /// tree to direction of the node \c root, i.e. it returns the last but 
deba@1699
   529
    /// one node from a shortest path from the \c root to \c node. It is 
deba@1699
   530
    /// INVALID if \c node is unreachable from the root or if \c node=root. 
deba@1699
   531
    /// The shortest path tree used here is equal to the 
deba@1763
   532
    /// shortest path tree used in \ref predEdge().  
deba@1699
   533
    /// \pre \ref run() must be called before using this function.
deba@1699
   534
    Node predNode(Node root, Node node) const { 
deba@1699
   535
      return (*_pred)(root, node) == INVALID ? 
deba@1699
   536
      INVALID : graph->source((*_pred)(root, node)); 
deba@1699
   537
    }
deba@1699
   538
    
deba@1699
   539
    /// \brief Returns a reference to the matrix node map of distances.
deba@1699
   540
    ///
deba@1699
   541
    /// Returns a reference to the matrix node map of distances. 
deba@1699
   542
    ///
deba@1699
   543
    /// \pre \ref run() must be called before using this function.
deba@1699
   544
    const DistMap &distMap() const { return *_dist;}
deba@1699
   545
 
deba@1699
   546
    /// \brief Returns a reference to the shortest path tree map.
deba@1699
   547
    ///
deba@1699
   548
    /// Returns a reference to the matrix node map of the edges of the
deba@1699
   549
    /// shortest path tree.
deba@1699
   550
    /// \pre \ref run() must be called before using this function.
deba@1699
   551
    const PredMap &predMap() const { return *_pred;}
deba@1699
   552
 
deba@1699
   553
    /// \brief Checks if a node is reachable from the root.
deba@1699
   554
    ///
deba@1699
   555
    /// Returns \c true if \c v is reachable from the root.
deba@1699
   556
    /// \pre \ref run() must be called before using this function.
deba@1699
   557
    ///
deba@1699
   558
    bool connected(Node source, Node target) { 
deba@1699
   559
      return (*_dist)(source, target) != OperationTraits::infinity(); 
deba@1699
   560
    }
deba@1699
   561
    
deba@1699
   562
    ///@}
deba@1699
   563
  };
deba@1699
   564
 
deba@1699
   565
} //END OF NAMESPACE LEMON
deba@1699
   566
deba@1699
   567
#endif
deba@1699
   568