lemon/goldberg_tarjan.h
author deba
Tue, 27 Nov 2007 15:41:43 +0000
changeset 2522 616c019215c4
parent 2518 4c0a23bd70b5
child 2527 10f3b3286e63
permissions -rw-r--r--
Performance bug in Preflow
The initial relabeling moved each node to the lowest level
Doc bug fix
deba@2514
     1
/* -*- C++ -*-
deba@2514
     2
 *
deba@2514
     3
 * This file is a part of LEMON, a generic C++ optimization library
deba@2514
     4
 *
deba@2514
     5
 * Copyright (C) 2003-2007
deba@2514
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@2514
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@2514
     8
 *
deba@2514
     9
 * Permission to use, modify and distribute this software is granted
deba@2514
    10
 * provided that this copyright notice appears in all copies. For
deba@2514
    11
 * precise terms see the accompanying LICENSE file.
deba@2514
    12
 *
deba@2514
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@2514
    14
 * express or implied, and with no claim as to its suitability for any
deba@2514
    15
 * purpose.
deba@2514
    16
 *
deba@2514
    17
 */
deba@2514
    18
deba@2514
    19
#ifndef LEMON_GOLDBERG_TARJAN_H
deba@2514
    20
#define LEMON_GOLDBERG_TARJAN_H
deba@2514
    21
deba@2514
    22
#include <vector>
deba@2514
    23
#include <queue>
deba@2514
    24
deba@2514
    25
#include <lemon/error.h>
deba@2514
    26
#include <lemon/bits/invalid.h>
deba@2514
    27
#include <lemon/tolerance.h>
deba@2514
    28
#include <lemon/maps.h>
deba@2514
    29
#include <lemon/graph_utils.h>
deba@2514
    30
#include <lemon/dynamic_tree.h>
deba@2514
    31
#include <limits>
deba@2514
    32
deba@2514
    33
/// \file
deba@2514
    34
/// \ingroup max_flow
deba@2514
    35
/// \brief Implementation of the preflow algorithm.
deba@2514
    36
deba@2514
    37
namespace lemon {
deba@2514
    38
deba@2514
    39
  /// \brief Default traits class of GoldbergTarjan class.
deba@2514
    40
  ///
deba@2514
    41
  /// Default traits class of GoldbergTarjan class.
deba@2514
    42
  /// \param _Graph Graph type.
deba@2514
    43
  /// \param _CapacityMap Type of capacity map.
deba@2514
    44
  template <typename _Graph, typename _CapacityMap>
deba@2514
    45
  struct GoldbergTarjanDefaultTraits {
deba@2514
    46
deba@2514
    47
    /// \brief The graph type the algorithm runs on. 
deba@2514
    48
    typedef _Graph Graph;
deba@2514
    49
deba@2514
    50
    /// \brief The type of the map that stores the edge capacities.
deba@2514
    51
    ///
deba@2514
    52
    /// The type of the map that stores the edge capacities.
deba@2514
    53
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
deba@2514
    54
    typedef _CapacityMap CapacityMap;
deba@2514
    55
deba@2514
    56
    /// \brief The type of the length of the edges.
deba@2514
    57
    typedef typename CapacityMap::Value Value;
deba@2514
    58
deba@2514
    59
    /// \brief The map type that stores the flow values.
deba@2514
    60
    ///
deba@2514
    61
    /// The map type that stores the flow values. 
deba@2514
    62
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
deba@2514
    63
    typedef typename Graph::template EdgeMap<Value> FlowMap;
deba@2514
    64
deba@2514
    65
    /// \brief Instantiates a FlowMap.
deba@2514
    66
    ///
deba@2514
    67
    /// This function instantiates a \ref FlowMap. 
deba@2514
    68
    /// \param graph The graph, to which we would like to define the flow map.
deba@2514
    69
    static FlowMap* createFlowMap(const Graph& graph) {
deba@2514
    70
      return new FlowMap(graph);
deba@2514
    71
    }
deba@2514
    72
deba@2514
    73
    /// \brief The eleavator type used by GoldbergTarjan algorithm.
deba@2514
    74
    /// 
deba@2514
    75
    /// The elevator type used by GoldbergTarjan algorithm.
deba@2514
    76
    ///
deba@2514
    77
    /// \sa Elevator
deba@2514
    78
    /// \sa LinkedElevator
deba@2514
    79
    typedef LinkedElevator<Graph, typename Graph::Node> Elevator;
deba@2514
    80
    
deba@2514
    81
    /// \brief Instantiates an Elevator.
deba@2514
    82
    ///
deba@2514
    83
    /// This function instantiates a \ref Elevator. 
deba@2514
    84
    /// \param graph The graph, to which we would like to define the elevator.
deba@2514
    85
    /// \param max_level The maximum level of the elevator.
deba@2514
    86
    static Elevator* createElevator(const Graph& graph, int max_level) {
deba@2514
    87
      return new Elevator(graph, max_level);
deba@2514
    88
    }
deba@2514
    89
deba@2514
    90
    /// \brief The tolerance used by the algorithm
deba@2514
    91
    ///
deba@2514
    92
    /// The tolerance used by the algorithm to handle inexact computation.
deba@2514
    93
    typedef Tolerance<Value> Tolerance;
deba@2514
    94
deba@2514
    95
  };
deba@2514
    96
deba@2514
    97
  /// \ingroup max_flow
deba@2514
    98
  /// \brief Goldberg-Tarjan algorithms class.
deba@2514
    99
  ///
deba@2514
   100
  /// This class provides an implementation of the \e GoldbergTarjan
deba@2514
   101
  /// \e algorithm producing a flow of maximum value in a directed
deba@2514
   102
  /// graph. The GoldbergTarjan algorithm is a theoretical improvement
deba@2514
   103
  /// of the Goldberg's \ref Preflow "preflow" algorithm by using the \ref
deba@2514
   104
  /// DynamicTree "dynamic tree" data structure of Sleator and Tarjan.
deba@2514
   105
  /// 
deba@2522
   106
  /// The original preflow algorithm with \e highest \e label
deba@2522
   107
  /// heuristic has \f$O(n^2\sqrt{e})\f$ or with \e FIFO heuristic has
deba@2522
   108
  /// \f$O(n^3)\f$ time complexity. The current algorithm improved
deba@2522
   109
  /// this complexity to \f$O(nm\log(\frac{n^2}{m}))\f$. The algorithm
deba@2522
   110
  /// builds limited size dynamic trees on the residual graph, which
deba@2522
   111
  /// can be used to make multilevel push operations and gives a
deba@2522
   112
  /// better bound on the number of non-saturating pushes.
deba@2514
   113
  ///
deba@2514
   114
  /// \param Graph The directed graph type the algorithm runs on.
deba@2514
   115
  /// \param CapacityMap The capacity map type.
deba@2514
   116
  /// \param _Traits Traits class to set various data types used by
deba@2514
   117
  /// the algorithm.  The default traits class is \ref
deba@2514
   118
  /// GoldbergTarjanDefaultTraits.  See \ref
deba@2514
   119
  /// GoldbergTarjanDefaultTraits for the documentation of a
deba@2514
   120
  /// Goldberg-Tarjan traits class.
deba@2514
   121
  ///
deba@2514
   122
  /// \author Tamas Hamori and Balazs Dezso
deba@2514
   123
#ifdef DOXYGEN
deba@2514
   124
  template <typename _Graph, typename _CapacityMap, typename _Traits> 
deba@2514
   125
#else
deba@2514
   126
  template <typename _Graph,
deba@2514
   127
	    typename _CapacityMap = typename _Graph::template EdgeMap<int>,
deba@2514
   128
            typename _Traits = 
deba@2514
   129
	    GoldbergTarjanDefaultTraits<_Graph, _CapacityMap> >
deba@2514
   130
#endif
deba@2514
   131
  class GoldbergTarjan {
deba@2514
   132
  public:
deba@2514
   133
deba@2514
   134
    typedef _Traits Traits;
deba@2514
   135
    typedef typename Traits::Graph Graph;
deba@2514
   136
    typedef typename Traits::CapacityMap CapacityMap;
deba@2514
   137
    typedef typename Traits::Value Value; 
deba@2514
   138
deba@2514
   139
    typedef typename Traits::FlowMap FlowMap;
deba@2514
   140
    typedef typename Traits::Elevator Elevator;
deba@2514
   141
    typedef typename Traits::Tolerance Tolerance;
deba@2514
   142
    
deba@2514
   143
  protected:
deba@2514
   144
deba@2514
   145
    GRAPH_TYPEDEFS(typename Graph);
deba@2514
   146
deba@2514
   147
    typedef typename Graph::template NodeMap<Node> NodeNodeMap;
deba@2514
   148
    typedef typename Graph::template NodeMap<int> IntNodeMap;
deba@2514
   149
deba@2514
   150
    typedef typename Graph::template NodeMap<Edge> EdgeNodeMap;
deba@2514
   151
    typedef typename Graph::template EdgeMap<Edge> EdgeEdgeMap;
deba@2514
   152
deba@2514
   153
    typedef typename std::vector<Node> VecNode;
deba@2514
   154
 
deba@2514
   155
    typedef DynamicTree<Value,IntNodeMap,Tolerance> DynTree;
deba@2514
   156
deba@2514
   157
    const Graph& _graph;
deba@2514
   158
    const CapacityMap* _capacity;
deba@2514
   159
    int _node_num; //the number of nodes of G
deba@2514
   160
deba@2514
   161
    Node _source;
deba@2514
   162
    Node _target;
deba@2514
   163
deba@2514
   164
    FlowMap* _flow;
deba@2514
   165
    bool _local_flow;
deba@2514
   166
deba@2514
   167
    Elevator* _level;
deba@2514
   168
    bool _local_level;
deba@2514
   169
deba@2514
   170
    typedef typename Graph::template NodeMap<Value> ExcessMap;
deba@2514
   171
    ExcessMap* _excess;
deba@2514
   172
    
deba@2514
   173
    Tolerance _tolerance;
deba@2514
   174
deba@2514
   175
    bool _phase;
deba@2514
   176
deba@2514
   177
    // constant for treesize
deba@2514
   178
    static const double _tree_bound = 2;
deba@2514
   179
    int _max_tree_size;
deba@2514
   180
    
deba@2514
   181
    //tags for the dynamic tree
deba@2514
   182
    DynTree *_dt; 
deba@2514
   183
    //datastructure of dyanamic tree
deba@2514
   184
    IntNodeMap *_dt_index;
deba@2514
   185
    //datastrucure for solution of the communication between the two class
deba@2514
   186
    EdgeNodeMap *_dt_edges; 
deba@2514
   187
    //nodeMap for storing the outgoing edge from the node in the tree  
deba@2514
   188
deba@2514
   189
    //max of the type Value
deba@2514
   190
    const Value _max_value;
deba@2514
   191
            
deba@2514
   192
  public:
deba@2514
   193
deba@2514
   194
    typedef GoldbergTarjan Create;
deba@2514
   195
deba@2514
   196
    ///\name Named template parameters
deba@2514
   197
deba@2514
   198
    ///@{
deba@2514
   199
deba@2514
   200
    template <typename _FlowMap>
deba@2514
   201
    struct DefFlowMapTraits : public Traits {
deba@2514
   202
      typedef _FlowMap FlowMap;
deba@2514
   203
      static FlowMap *createFlowMap(const Graph&) {
deba@2514
   204
	throw UninitializedParameter();
deba@2514
   205
      }
deba@2514
   206
    };
deba@2514
   207
deba@2514
   208
    /// \brief \ref named-templ-param "Named parameter" for setting
deba@2514
   209
    /// FlowMap type
deba@2514
   210
    ///
deba@2514
   211
    /// \ref named-templ-param "Named parameter" for setting FlowMap
deba@2514
   212
    /// type
deba@2514
   213
    template <typename _FlowMap>
deba@2514
   214
    struct DefFlowMap 
deba@2514
   215
      : public GoldbergTarjan<Graph, CapacityMap, 
deba@2514
   216
			      DefFlowMapTraits<_FlowMap> > {
deba@2514
   217
      typedef GoldbergTarjan<Graph, CapacityMap, 
deba@2514
   218
			     DefFlowMapTraits<_FlowMap> > Create;
deba@2514
   219
    };
deba@2514
   220
deba@2514
   221
    template <typename _Elevator>
deba@2514
   222
    struct DefElevatorTraits : public Traits {
deba@2514
   223
      typedef _Elevator Elevator;
deba@2514
   224
      static Elevator *createElevator(const Graph&, int) {
deba@2514
   225
	throw UninitializedParameter();
deba@2514
   226
      }
deba@2514
   227
    };
deba@2514
   228
deba@2514
   229
    /// \brief \ref named-templ-param "Named parameter" for setting
deba@2514
   230
    /// Elevator type
deba@2514
   231
    ///
deba@2514
   232
    /// \ref named-templ-param "Named parameter" for setting Elevator
deba@2514
   233
    /// type
deba@2514
   234
    template <typename _Elevator>
deba@2514
   235
    struct DefElevator 
deba@2514
   236
      : public GoldbergTarjan<Graph, CapacityMap, 
deba@2514
   237
			      DefElevatorTraits<_Elevator> > {
deba@2514
   238
      typedef GoldbergTarjan<Graph, CapacityMap, 
deba@2514
   239
			     DefElevatorTraits<_Elevator> > Create;
deba@2514
   240
    };
deba@2514
   241
deba@2514
   242
    template <typename _Elevator>
deba@2514
   243
    struct DefStandardElevatorTraits : public Traits {
deba@2514
   244
      typedef _Elevator Elevator;
deba@2514
   245
      static Elevator *createElevator(const Graph& graph, int max_level) {
deba@2514
   246
	return new Elevator(graph, max_level);
deba@2514
   247
      }
deba@2514
   248
    };
deba@2514
   249
deba@2514
   250
    /// \brief \ref named-templ-param "Named parameter" for setting
deba@2514
   251
    /// Elevator type
deba@2514
   252
    ///
deba@2514
   253
    /// \ref named-templ-param "Named parameter" for setting Elevator
deba@2514
   254
    /// type. The Elevator should be standard constructor interface, ie.
deba@2514
   255
    /// the graph and the maximum level should be passed to it.
deba@2514
   256
    template <typename _Elevator>
deba@2514
   257
    struct DefStandardElevator 
deba@2514
   258
      : public GoldbergTarjan<Graph, CapacityMap, 
deba@2514
   259
			      DefStandardElevatorTraits<_Elevator> > {
deba@2514
   260
      typedef GoldbergTarjan<Graph, CapacityMap, 
deba@2514
   261
			     DefStandardElevatorTraits<_Elevator> > Create;
deba@2514
   262
    };    
deba@2514
   263
deba@2514
   264
deba@2514
   265
    ///\ref Exception for the case when s=t.
deba@2514
   266
deba@2514
   267
    ///\ref Exception for the case when the source equals the target.
deba@2514
   268
    class InvalidArgument : public lemon::LogicError {
deba@2514
   269
    public:
deba@2514
   270
      virtual const char* what() const throw() {
deba@2514
   271
	return "lemon::GoldbergTarjan::InvalidArgument";
deba@2514
   272
      }
deba@2514
   273
    };
deba@2514
   274
deba@2514
   275
  public: 
deba@2514
   276
deba@2514
   277
    /// \brief The constructor of the class.
deba@2514
   278
    ///
deba@2514
   279
    /// The constructor of the class. 
deba@2514
   280
    /// \param graph The directed graph the algorithm runs on. 
deba@2514
   281
    /// \param capacity The capacity of the edges. 
deba@2514
   282
    /// \param source The source node.
deba@2514
   283
    /// \param target The target node.
deba@2514
   284
    /// Except the graph, all of these parameters can be reset by
deba@2514
   285
    /// calling \ref source, \ref target, \ref capacityMap and \ref
deba@2514
   286
    /// flowMap, resp.
deba@2514
   287
    GoldbergTarjan(const Graph& graph, const CapacityMap& capacity,
deba@2514
   288
		   Node source, Node target) 
deba@2514
   289
      : _graph(graph), _capacity(&capacity), 
deba@2514
   290
	_node_num(), _source(source), _target(target),
deba@2514
   291
	_flow(0), _local_flow(false),
deba@2514
   292
	_level(0), _local_level(false),
deba@2514
   293
	_excess(0), _tolerance(), 
deba@2514
   294
	_phase(), _max_tree_size(),
deba@2514
   295
	_dt(0), _dt_index(0), _dt_edges(0), 
deba@2514
   296
	_max_value(std::numeric_limits<Value>::max()) { 
deba@2514
   297
      if (_source == _target) throw InvalidArgument();
deba@2514
   298
    }
deba@2514
   299
deba@2514
   300
    /// \brief Destrcutor.
deba@2514
   301
    ///
deba@2514
   302
    /// Destructor.
deba@2514
   303
    ~GoldbergTarjan() {
deba@2514
   304
      destroyStructures();
deba@2514
   305
    }
deba@2514
   306
    
deba@2514
   307
    /// \brief Sets the capacity map.
deba@2514
   308
    ///
deba@2514
   309
    /// Sets the capacity map.
deba@2514
   310
    /// \return \c (*this)
deba@2514
   311
    GoldbergTarjan& capacityMap(const CapacityMap& map) {
deba@2514
   312
      _capacity = &map;
deba@2514
   313
      return *this;
deba@2514
   314
    }
deba@2514
   315
deba@2514
   316
    /// \brief Sets the flow map.
deba@2514
   317
    ///
deba@2514
   318
    /// Sets the flow map.
deba@2514
   319
    /// \return \c (*this)
deba@2514
   320
    GoldbergTarjan& flowMap(FlowMap& map) {
deba@2514
   321
      if (_local_flow) {
deba@2514
   322
	delete _flow;
deba@2514
   323
	_local_flow = false;
deba@2514
   324
      }
deba@2514
   325
      _flow = &map;
deba@2514
   326
      return *this;
deba@2514
   327
    }
deba@2514
   328
deba@2514
   329
    /// \brief Returns the flow map.
deba@2514
   330
    ///
deba@2514
   331
    /// \return The flow map.
deba@2514
   332
    const FlowMap& flowMap() {
deba@2514
   333
      return *_flow;
deba@2514
   334
    }
deba@2514
   335
deba@2514
   336
    /// \brief Sets the elevator.
deba@2514
   337
    ///
deba@2514
   338
    /// Sets the elevator.
deba@2514
   339
    /// \return \c (*this)
deba@2514
   340
    GoldbergTarjan& elevator(Elevator& elevator) {
deba@2514
   341
      if (_local_level) {
deba@2514
   342
	delete _level;
deba@2514
   343
	_local_level = false;
deba@2514
   344
      }
deba@2514
   345
      _level = &elevator;
deba@2514
   346
      return *this;
deba@2514
   347
    }
deba@2514
   348
deba@2514
   349
    /// \brief Returns the elevator.
deba@2514
   350
    ///
deba@2514
   351
    /// \return The elevator.
deba@2514
   352
    const Elevator& elevator() {
deba@2514
   353
      return *_level;
deba@2514
   354
    }
deba@2514
   355
deba@2514
   356
    /// \brief Sets the source node.
deba@2514
   357
    ///
deba@2514
   358
    /// Sets the source node.
deba@2514
   359
    /// \return \c (*this)
deba@2514
   360
    GoldbergTarjan& source(const Node& node) {
deba@2514
   361
      _source = node;
deba@2514
   362
      return *this;
deba@2514
   363
    }
deba@2514
   364
deba@2514
   365
    /// \brief Sets the target node.
deba@2514
   366
    ///
deba@2514
   367
    /// Sets the target node.
deba@2514
   368
    /// \return \c (*this)
deba@2514
   369
    GoldbergTarjan& target(const Node& node) {
deba@2514
   370
      _target = node;
deba@2514
   371
      return *this;
deba@2514
   372
    }
deba@2514
   373
 
deba@2514
   374
    /// \brief Sets the tolerance used by algorithm.
deba@2514
   375
    ///
deba@2514
   376
    /// Sets the tolerance used by algorithm.
deba@2514
   377
    GoldbergTarjan& tolerance(const Tolerance& tolerance) const {
deba@2514
   378
      _tolerance = tolerance;
deba@2514
   379
      if (_dt) {
deba@2514
   380
	_dt->tolerance(_tolerance);
deba@2514
   381
      }
deba@2514
   382
      return *this;
deba@2514
   383
    } 
deba@2514
   384
deba@2514
   385
    /// \brief Returns the tolerance used by algorithm.
deba@2514
   386
    ///
deba@2514
   387
    /// Returns the tolerance used by algorithm.
deba@2514
   388
    const Tolerance& tolerance() const {
deba@2514
   389
      return tolerance;
deba@2514
   390
    } 
deba@2514
   391
deba@2514
   392
         
deba@2514
   393
  private:
deba@2514
   394
    
deba@2514
   395
    void createStructures() {
deba@2514
   396
      _node_num = countNodes(_graph);
deba@2514
   397
deba@2518
   398
      _max_tree_size = int((double(_node_num) * double(_node_num)) / 
deba@2518
   399
			   double(countEdges(_graph)));
deba@2514
   400
deba@2514
   401
      if (!_flow) {
deba@2514
   402
	_flow = Traits::createFlowMap(_graph);
deba@2514
   403
	_local_flow = true;
deba@2514
   404
      }
deba@2514
   405
      if (!_level) {
deba@2514
   406
	_level = Traits::createElevator(_graph, _node_num);
deba@2514
   407
	_local_level = true;
deba@2514
   408
      }
deba@2514
   409
      if (!_excess) {
deba@2514
   410
	_excess = new ExcessMap(_graph);
deba@2514
   411
      }
deba@2514
   412
      if (!_dt_index && !_dt) {
deba@2514
   413
	_dt_index = new IntNodeMap(_graph);
deba@2514
   414
	_dt = new DynTree(*_dt_index, _tolerance);
deba@2514
   415
      }
deba@2514
   416
      if (!_dt_edges) {
deba@2514
   417
	_dt_edges = new EdgeNodeMap(_graph);
deba@2514
   418
      }
deba@2514
   419
    }
deba@2514
   420
deba@2514
   421
    void destroyStructures() {
deba@2514
   422
      if (_local_flow) {
deba@2514
   423
	delete _flow;
deba@2514
   424
      }
deba@2514
   425
      if (_local_level) {
deba@2514
   426
	delete _level;
deba@2514
   427
      }
deba@2514
   428
      if (_excess) {
deba@2514
   429
	delete _excess;
deba@2514
   430
      }
deba@2514
   431
      if (_dt) {
deba@2514
   432
	delete _dt;
deba@2514
   433
      }
deba@2514
   434
      if (_dt_index) {
deba@2514
   435
	delete _dt_index;
deba@2514
   436
      }
deba@2514
   437
      if (_dt_edges) {
deba@2514
   438
	delete _dt_edges;
deba@2514
   439
      }
deba@2514
   440
    }
deba@2514
   441
deba@2514
   442
    bool sendOut(Node n, Value& excess) {
deba@2514
   443
deba@2514
   444
      Node w = _dt->findRoot(n);
deba@2514
   445
      
deba@2514
   446
      while (w != n) {
deba@2514
   447
      
deba@2514
   448
	Value rem;      
deba@2514
   449
	Node u = _dt->findCost(n, rem);
deba@2514
   450
deba@2514
   451
        if (_tolerance.positive(rem) && !_level->active(w) && w != _target) {
deba@2514
   452
	  _level->activate(w);
deba@2514
   453
        }
deba@2514
   454
deba@2514
   455
        if (!_tolerance.less(rem, excess)) {
deba@2514
   456
	  _dt->addCost(n, - excess);
deba@2514
   457
	  _excess->set(w, (*_excess)[w] + excess);
deba@2514
   458
	  excess = 0;
deba@2514
   459
	  return true;
deba@2514
   460
	}
deba@2514
   461
	
deba@2514
   462
	
deba@2514
   463
        _dt->addCost(n, - rem);
deba@2514
   464
deba@2514
   465
        excess -= rem;
deba@2514
   466
        _excess->set(w, (*_excess)[w] + rem);
deba@2514
   467
        
deba@2514
   468
	_dt->cut(u);
deba@2514
   469
	_dt->addCost(u, _max_value);
deba@2514
   470
	  
deba@2514
   471
	Edge e = (*_dt_edges)[u];
deba@2514
   472
	_dt_edges->set(u, INVALID);
deba@2514
   473
        
deba@2514
   474
	if (u == _graph.source(e)) {
deba@2514
   475
	  _flow->set(e, (*_capacity)[e]);
deba@2514
   476
	} else {
deba@2514
   477
	  _flow->set(e, 0);
deba@2514
   478
	}           
deba@2514
   479
deba@2514
   480
        w = _dt->findRoot(n);
deba@2514
   481
      }      
deba@2514
   482
      return false;
deba@2514
   483
    }
deba@2514
   484
deba@2514
   485
    bool sendIn(Node n, Value& excess) {
deba@2514
   486
deba@2514
   487
      Node w = _dt->findRoot(n);
deba@2514
   488
      
deba@2514
   489
      while (w != n) {
deba@2514
   490
      
deba@2514
   491
	Value rem;      
deba@2514
   492
	Node u = _dt->findCost(n, rem);
deba@2514
   493
deba@2514
   494
        if (_tolerance.positive(rem) && !_level->active(w) && w != _source) {
deba@2514
   495
	  _level->activate(w);
deba@2514
   496
        }
deba@2514
   497
deba@2514
   498
        if (!_tolerance.less(rem, excess)) {
deba@2514
   499
	  _dt->addCost(n, - excess);
deba@2514
   500
	  _excess->set(w, (*_excess)[w] + excess);
deba@2514
   501
	  excess = 0;
deba@2514
   502
	  return true;
deba@2514
   503
	}
deba@2514
   504
	
deba@2514
   505
	
deba@2514
   506
        _dt->addCost(n, - rem);
deba@2514
   507
deba@2514
   508
        excess -= rem;
deba@2514
   509
        _excess->set(w, (*_excess)[w] + rem);
deba@2514
   510
        
deba@2514
   511
	_dt->cut(u);
deba@2514
   512
	_dt->addCost(u, _max_value);
deba@2514
   513
	  
deba@2514
   514
	Edge e = (*_dt_edges)[u];
deba@2514
   515
	_dt_edges->set(u, INVALID);
deba@2514
   516
        
deba@2514
   517
	if (u == _graph.source(e)) {
deba@2514
   518
	  _flow->set(e, (*_capacity)[e]);
deba@2514
   519
	} else {
deba@2514
   520
	  _flow->set(e, 0);
deba@2514
   521
	}           
deba@2514
   522
deba@2514
   523
        w = _dt->findRoot(n);
deba@2514
   524
      }      
deba@2514
   525
      return false;
deba@2514
   526
    }
deba@2514
   527
deba@2514
   528
    void cutChildren(Node n) {
deba@2514
   529
    
deba@2514
   530
      for (OutEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   531
        
deba@2514
   532
        Node v = _graph.target(e);
deba@2514
   533
        
deba@2514
   534
        if ((*_dt_edges)[v] != INVALID && (*_dt_edges)[v] == e) {
deba@2514
   535
          _dt->cut(v);
deba@2514
   536
          _dt_edges->set(v, INVALID);
deba@2514
   537
	  Value rem;
deba@2514
   538
          _dt->findCost(v, rem);
deba@2514
   539
          _dt->addCost(v, - rem);
deba@2514
   540
          _dt->addCost(v, _max_value);
deba@2514
   541
          _flow->set(e, rem);
deba@2514
   542
deba@2514
   543
        }      
deba@2514
   544
      }
deba@2514
   545
deba@2514
   546
      for (InEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   547
        
deba@2514
   548
        Node v = _graph.source(e);
deba@2514
   549
        
deba@2514
   550
        if ((*_dt_edges)[v] != INVALID && (*_dt_edges)[v] == e) {
deba@2514
   551
          _dt->cut(v);
deba@2514
   552
          _dt_edges->set(v, INVALID);
deba@2514
   553
	  Value rem;
deba@2514
   554
          _dt->findCost(v, rem);
deba@2514
   555
          _dt->addCost(v, - rem);
deba@2514
   556
          _dt->addCost(v, _max_value);
deba@2514
   557
          _flow->set(e, (*_capacity)[e] - rem);
deba@2514
   558
deba@2514
   559
        }      
deba@2514
   560
      }
deba@2514
   561
    }
deba@2514
   562
deba@2514
   563
    void extractTrees() {
deba@2514
   564
      for (NodeIt n(_graph); n != INVALID; ++n) {
deba@2514
   565
	
deba@2514
   566
	Node w = _dt->findRoot(n);
deba@2514
   567
      
deba@2514
   568
	while (w != n) {
deba@2514
   569
      
deba@2514
   570
	  Value rem;      
deba@2514
   571
	  Node u = _dt->findCost(n, rem);
deba@2514
   572
deba@2514
   573
	  _dt->cut(u);
deba@2514
   574
	  _dt->addCost(u, - rem);
deba@2514
   575
	  _dt->addCost(u, _max_value);
deba@2514
   576
	  
deba@2514
   577
	  Edge e = (*_dt_edges)[u];
deba@2514
   578
	  _dt_edges->set(u, INVALID);
deba@2514
   579
	  
deba@2514
   580
	  if (u == _graph.source(e)) {
deba@2514
   581
	    _flow->set(e, (*_capacity)[e] - rem);
deba@2514
   582
	  } else {
deba@2514
   583
	    _flow->set(e, rem);
deba@2514
   584
	  }
deba@2514
   585
	  
deba@2514
   586
	  w = _dt->findRoot(n);
deba@2514
   587
	}      
deba@2514
   588
      }
deba@2514
   589
    }
deba@2514
   590
deba@2514
   591
  public:    
deba@2514
   592
deba@2514
   593
    /// \name Execution control The simplest way to execute the
deba@2514
   594
    /// algorithm is to use one of the member functions called \c
deba@2514
   595
    /// run().  
deba@2514
   596
    /// \n
deba@2514
   597
    /// If you need more control on initial solution or
deba@2514
   598
    /// execution then you have to call one \ref init() function and then
deba@2514
   599
    /// the startFirstPhase() and if you need the startSecondPhase().  
deba@2514
   600
    
deba@2514
   601
    ///@{
deba@2514
   602
deba@2514
   603
    /// \brief Initializes the internal data structures.
deba@2514
   604
    ///
deba@2514
   605
    /// Initializes the internal data structures.
deba@2514
   606
    ///
deba@2514
   607
    void init() {
deba@2514
   608
      createStructures();
deba@2514
   609
deba@2514
   610
      for (NodeIt n(_graph); n != INVALID; ++n) {
deba@2514
   611
	_excess->set(n, 0);
deba@2514
   612
      }
deba@2514
   613
deba@2514
   614
      for (EdgeIt e(_graph); e != INVALID; ++e) {
deba@2514
   615
	_flow->set(e, 0);
deba@2514
   616
      }
deba@2514
   617
deba@2514
   618
      _dt->clear();
deba@2514
   619
      for (NodeIt v(_graph); v != INVALID; ++v) {
deba@2514
   620
        (*_dt_edges)[v] = INVALID;
deba@2514
   621
        _dt->makeTree(v);
deba@2514
   622
        _dt->addCost(v, _max_value);
deba@2514
   623
      }
deba@2514
   624
deba@2514
   625
      typename Graph::template NodeMap<bool> reached(_graph, false);
deba@2514
   626
deba@2514
   627
      _level->initStart();
deba@2514
   628
      _level->initAddItem(_target);
deba@2514
   629
deba@2514
   630
      std::vector<Node> queue;
deba@2514
   631
      reached.set(_source, true);
deba@2514
   632
deba@2514
   633
      queue.push_back(_target);
deba@2514
   634
      reached.set(_target, true);
deba@2514
   635
      while (!queue.empty()) {
deba@2514
   636
	_level->initNewLevel();
deba@2514
   637
	std::vector<Node> nqueue;
deba@2514
   638
	for (int i = 0; i < int(queue.size()); ++i) {
deba@2514
   639
	  Node n = queue[i];
deba@2514
   640
	  for (InEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   641
	    Node u = _graph.source(e);
deba@2514
   642
	    if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
deba@2514
   643
	      reached.set(u, true);
deba@2514
   644
	      _level->initAddItem(u);
deba@2514
   645
	      nqueue.push_back(u);
deba@2514
   646
	    }
deba@2514
   647
	  }
deba@2514
   648
	}
deba@2514
   649
	queue.swap(nqueue);
deba@2514
   650
      }
deba@2514
   651
      _level->initFinish();
deba@2514
   652
deba@2514
   653
      for (OutEdgeIt e(_graph, _source); e != INVALID; ++e) {
deba@2514
   654
	if (_tolerance.positive((*_capacity)[e])) {
deba@2514
   655
	  Node u = _graph.target(e);
deba@2514
   656
	  if ((*_level)[u] == _level->maxLevel()) continue;
deba@2514
   657
	  _flow->set(e, (*_capacity)[e]);
deba@2514
   658
	  _excess->set(u, (*_excess)[u] + (*_capacity)[e]);
deba@2514
   659
	  if (u != _target && !_level->active(u)) {
deba@2514
   660
	    _level->activate(u);
deba@2514
   661
	  }
deba@2514
   662
	}
deba@2514
   663
      }
deba@2514
   664
    }
deba@2514
   665
deba@2514
   666
    /// \brief Starts the first phase of the preflow algorithm.
deba@2514
   667
    ///
deba@2514
   668
    /// The preflow algorithm consists of two phases, this method runs
deba@2514
   669
    /// the first phase. After the first phase the maximum flow value
deba@2514
   670
    /// and a minimum value cut can already be computed, although a
deba@2514
   671
    /// maximum flow is not yet obtained. So after calling this method
deba@2514
   672
    /// \ref flowValue() returns the value of a maximum flow and \ref
deba@2514
   673
    /// minCut() returns a minimum cut.     
deba@2514
   674
    /// \pre One of the \ref init() functions should be called. 
deba@2514
   675
    void startFirstPhase() {
deba@2514
   676
      _phase = true;
deba@2514
   677
      Node n;
deba@2514
   678
deba@2514
   679
      while ((n = _level->highestActive()) != INVALID) {
deba@2514
   680
	Value excess = (*_excess)[n];
deba@2514
   681
	int level = _level->highestActiveLevel();
deba@2514
   682
	int new_level = _level->maxLevel();
deba@2514
   683
deba@2514
   684
	if (_dt->findRoot(n) != n) {
deba@2514
   685
	  if (sendOut(n, excess)) goto no_more_push;
deba@2514
   686
	}
deba@2514
   687
	
deba@2514
   688
	for (OutEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   689
	  Value rem = (*_capacity)[e] - (*_flow)[e];
deba@2514
   690
	  Node v = _graph.target(e);
deba@2514
   691
	  
deba@2514
   692
	  if (!_tolerance.positive(rem) && (*_dt_edges)[v] != e) continue;
deba@2514
   693
deba@2514
   694
	  if ((*_level)[v] < level) {
deba@2514
   695
	    
deba@2514
   696
	    if (_dt->findSize(n) + _dt->findSize(v) < 
deba@2514
   697
		_tree_bound * _max_tree_size) {
deba@2514
   698
	      _dt->addCost(n, -_max_value);
deba@2514
   699
	      _dt->addCost(n, rem);
deba@2514
   700
	      _dt->link(n, v);
deba@2514
   701
	      _dt_edges->set(n, e);
deba@2514
   702
	      if (sendOut(n, excess)) goto no_more_push;
deba@2514
   703
	    } else {
deba@2514
   704
	      if (!_level->active(v) && v != _target) {
deba@2514
   705
		_level->activate(v);
deba@2514
   706
	      }
deba@2514
   707
	      if (!_tolerance.less(rem, excess)) {
deba@2514
   708
		_flow->set(e, (*_flow)[e] + excess);
deba@2514
   709
		_excess->set(v, (*_excess)[v] + excess);
deba@2514
   710
		excess = 0;		  
deba@2514
   711
		goto no_more_push;
deba@2514
   712
	      } else {
deba@2514
   713
		excess -= rem;
deba@2514
   714
		_excess->set(v, (*_excess)[v] + rem);
deba@2514
   715
		_flow->set(e, (*_capacity)[e]);
deba@2514
   716
	      }		
deba@2514
   717
	    }
deba@2514
   718
	  } else if (new_level > (*_level)[v]) {
deba@2514
   719
	    new_level = (*_level)[v];
deba@2514
   720
	  }
deba@2514
   721
	}
deba@2514
   722
deba@2514
   723
	for (InEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   724
	  Value rem = (*_flow)[e];
deba@2514
   725
	  Node v = _graph.source(e);
deba@2514
   726
	  if (!_tolerance.positive(rem) && (*_dt_edges)[v] != e) continue;
deba@2514
   727
deba@2514
   728
	  if ((*_level)[v] < level) {
deba@2514
   729
	    
deba@2514
   730
	    if (_dt->findSize(n) + _dt->findSize(v) < 
deba@2514
   731
		_tree_bound * _max_tree_size) {
deba@2514
   732
	      _dt->addCost(n, - _max_value);
deba@2514
   733
	      _dt->addCost(n, rem);
deba@2514
   734
	      _dt->link(n, v);
deba@2514
   735
	      _dt_edges->set(n, e);
deba@2514
   736
	      if (sendOut(n, excess)) goto no_more_push;
deba@2514
   737
	    } else {
deba@2514
   738
	      if (!_level->active(v) && v != _target) {
deba@2514
   739
		_level->activate(v);
deba@2514
   740
	      }
deba@2514
   741
	      if (!_tolerance.less(rem, excess)) {
deba@2514
   742
		_flow->set(e, (*_flow)[e] - excess);
deba@2514
   743
		_excess->set(v, (*_excess)[v] + excess);
deba@2514
   744
		excess = 0;		  
deba@2514
   745
		goto no_more_push;
deba@2514
   746
	      } else {
deba@2514
   747
		excess -= rem;
deba@2514
   748
		_excess->set(v, (*_excess)[v] + rem);
deba@2514
   749
		_flow->set(e, 0);
deba@2514
   750
	      }		
deba@2514
   751
	    }
deba@2514
   752
	  } else if (new_level > (*_level)[v]) {
deba@2514
   753
	    new_level = (*_level)[v];
deba@2514
   754
	  }
deba@2514
   755
	}
deba@2514
   756
		
deba@2514
   757
      no_more_push:
deba@2514
   758
deba@2514
   759
	_excess->set(n, excess);
deba@2514
   760
	
deba@2514
   761
	if (excess != 0) {
deba@2514
   762
	  cutChildren(n);
deba@2514
   763
	  if (new_level + 1 < _level->maxLevel()) {
deba@2514
   764
	    _level->liftHighestActive(new_level + 1);
deba@2514
   765
	  } else {
deba@2514
   766
	    _level->liftHighestActiveToTop();
deba@2514
   767
	  }
deba@2514
   768
	  if (_level->emptyLevel(level)) {
deba@2514
   769
	    _level->liftToTop(level);
deba@2514
   770
	  }
deba@2514
   771
	} else {
deba@2514
   772
	  _level->deactivate(n);
deba@2514
   773
	}	
deba@2514
   774
      }
deba@2514
   775
      extractTrees();
deba@2514
   776
    }
deba@2514
   777
deba@2514
   778
    /// \brief Starts the second phase of the preflow algorithm.
deba@2514
   779
    ///
deba@2514
   780
    /// The preflow algorithm consists of two phases, this method runs
deba@2514
   781
    /// the second phase. After calling \ref init() and \ref
deba@2514
   782
    /// startFirstPhase() and then \ref startSecondPhase(), \ref
deba@2514
   783
    /// flowMap() return a maximum flow, \ref flowValue() returns the
deba@2514
   784
    /// value of a maximum flow, \ref minCut() returns a minimum cut
deba@2514
   785
    /// \pre The \ref init() and startFirstPhase() functions should be
deba@2514
   786
    /// called before.
deba@2514
   787
    void startSecondPhase() {
deba@2514
   788
      _phase = false;
deba@2514
   789
      
deba@2514
   790
      typename Graph::template NodeMap<bool> reached(_graph, false);
deba@2514
   791
      for (NodeIt n(_graph); n != INVALID; ++n) {
deba@2514
   792
	reached.set(n, (*_level)[n] < _level->maxLevel());
deba@2514
   793
      }
deba@2514
   794
deba@2514
   795
      _level->initStart();
deba@2514
   796
      _level->initAddItem(_source);
deba@2514
   797
 
deba@2514
   798
      std::vector<Node> queue;
deba@2514
   799
      queue.push_back(_source);
deba@2514
   800
      reached.set(_source, true);
deba@2514
   801
deba@2514
   802
      while (!queue.empty()) {
deba@2514
   803
	_level->initNewLevel();
deba@2514
   804
	std::vector<Node> nqueue;
deba@2514
   805
	for (int i = 0; i < int(queue.size()); ++i) {
deba@2514
   806
	  Node n = queue[i];
deba@2514
   807
	  for (OutEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   808
	    Node v = _graph.target(e);
deba@2514
   809
	    if (!reached[v] && _tolerance.positive((*_flow)[e])) {
deba@2514
   810
	      reached.set(v, true);
deba@2514
   811
	      _level->initAddItem(v);
deba@2514
   812
	      nqueue.push_back(v);
deba@2514
   813
	    }
deba@2514
   814
	  }
deba@2514
   815
	  for (InEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   816
	    Node u = _graph.source(e);
deba@2514
   817
	    if (!reached[u] && 
deba@2514
   818
		_tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
deba@2514
   819
	      reached.set(u, true);
deba@2514
   820
	      _level->initAddItem(u);
deba@2514
   821
	      nqueue.push_back(u);
deba@2514
   822
	    }
deba@2514
   823
	  }
deba@2514
   824
	}
deba@2514
   825
	queue.swap(nqueue);
deba@2514
   826
      }
deba@2514
   827
      _level->initFinish();
deba@2514
   828
deba@2514
   829
      for (NodeIt n(_graph); n != INVALID; ++n) {
deba@2518
   830
	if (!reached[n]) {
deba@2518
   831
	  _level->markToBottom(n);
deba@2518
   832
	} else if ((*_excess)[n] > 0 && _target != n) {
deba@2514
   833
	  _level->activate(n);
deba@2514
   834
	}
deba@2514
   835
      }
deba@2514
   836
deba@2514
   837
      Node n;
deba@2514
   838
deba@2514
   839
      while ((n = _level->highestActive()) != INVALID) {
deba@2514
   840
	Value excess = (*_excess)[n];
deba@2514
   841
	int level = _level->highestActiveLevel();
deba@2514
   842
	int new_level = _level->maxLevel();
deba@2514
   843
deba@2514
   844
	if (_dt->findRoot(n) != n) {
deba@2514
   845
	  if (sendIn(n, excess)) goto no_more_push;
deba@2514
   846
	}
deba@2514
   847
	
deba@2514
   848
	for (OutEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   849
	  Value rem = (*_capacity)[e] - (*_flow)[e];
deba@2514
   850
	  Node v = _graph.target(e);
deba@2514
   851
	  
deba@2514
   852
	  if (!_tolerance.positive(rem) && (*_dt_edges)[v] != e) continue;
deba@2514
   853
deba@2514
   854
	  if ((*_level)[v] < level) {
deba@2514
   855
	    
deba@2514
   856
	    if (_dt->findSize(n) + _dt->findSize(v) < 
deba@2514
   857
		_tree_bound * _max_tree_size) {
deba@2514
   858
	      _dt->addCost(n, -_max_value);
deba@2514
   859
	      _dt->addCost(n, rem);
deba@2514
   860
	      _dt->link(n, v);
deba@2514
   861
	      _dt_edges->set(n, e);
deba@2514
   862
	      if (sendIn(n, excess)) goto no_more_push;
deba@2514
   863
	    } else {
deba@2514
   864
	      if (!_level->active(v) && v != _source) {
deba@2514
   865
		_level->activate(v);
deba@2514
   866
	      }
deba@2514
   867
	      if (!_tolerance.less(rem, excess)) {
deba@2514
   868
		_flow->set(e, (*_flow)[e] + excess);
deba@2514
   869
		_excess->set(v, (*_excess)[v] + excess);
deba@2514
   870
		excess = 0;		  
deba@2514
   871
		goto no_more_push;
deba@2514
   872
	      } else {
deba@2514
   873
		excess -= rem;
deba@2514
   874
		_excess->set(v, (*_excess)[v] + rem);
deba@2514
   875
		_flow->set(e, (*_capacity)[e]);
deba@2514
   876
	      }		
deba@2514
   877
	    }
deba@2514
   878
	  } else if (new_level > (*_level)[v]) {
deba@2514
   879
	    new_level = (*_level)[v];
deba@2514
   880
	  }
deba@2514
   881
	}
deba@2514
   882
deba@2514
   883
	for (InEdgeIt e(_graph, n); e != INVALID; ++e) {
deba@2514
   884
	  Value rem = (*_flow)[e];
deba@2514
   885
	  Node v = _graph.source(e);
deba@2514
   886
	  if (!_tolerance.positive(rem) && (*_dt_edges)[v] != e) continue;
deba@2514
   887
deba@2514
   888
	  if ((*_level)[v] < level) {
deba@2514
   889
	    
deba@2514
   890
	    if (_dt->findSize(n) + _dt->findSize(v) < 
deba@2514
   891
		_tree_bound * _max_tree_size) {
deba@2514
   892
	      _dt->addCost(n, - _max_value);
deba@2514
   893
	      _dt->addCost(n, rem);
deba@2514
   894
	      _dt->link(n, v);
deba@2514
   895
	      _dt_edges->set(n, e);
deba@2514
   896
	      if (sendIn(n, excess)) goto no_more_push;
deba@2514
   897
	    } else {
deba@2514
   898
	      if (!_level->active(v) && v != _source) {
deba@2514
   899
		_level->activate(v);
deba@2514
   900
	      }
deba@2514
   901
	      if (!_tolerance.less(rem, excess)) {
deba@2514
   902
		_flow->set(e, (*_flow)[e] - excess);
deba@2514
   903
		_excess->set(v, (*_excess)[v] + excess);
deba@2514
   904
		excess = 0;		  
deba@2514
   905
		goto no_more_push;
deba@2514
   906
	      } else {
deba@2514
   907
		excess -= rem;
deba@2514
   908
		_excess->set(v, (*_excess)[v] + rem);
deba@2514
   909
		_flow->set(e, 0);
deba@2514
   910
	      }		
deba@2514
   911
	    }
deba@2514
   912
	  } else if (new_level > (*_level)[v]) {
deba@2514
   913
	    new_level = (*_level)[v];
deba@2514
   914
	  }
deba@2514
   915
	}
deba@2514
   916
		
deba@2514
   917
      no_more_push:
deba@2514
   918
deba@2514
   919
	_excess->set(n, excess);
deba@2514
   920
	
deba@2514
   921
	if (excess != 0) {
deba@2514
   922
	  cutChildren(n);
deba@2514
   923
	  if (new_level + 1 < _level->maxLevel()) {
deba@2514
   924
	    _level->liftHighestActive(new_level + 1);
deba@2514
   925
	  } else {
deba@2514
   926
	    _level->liftHighestActiveToTop();
deba@2514
   927
	  }
deba@2514
   928
	  if (_level->emptyLevel(level)) {
deba@2514
   929
	    _level->liftToTop(level);
deba@2514
   930
	  }
deba@2514
   931
	} else {
deba@2514
   932
	  _level->deactivate(n);
deba@2514
   933
	}	
deba@2514
   934
      }
deba@2514
   935
      extractTrees();
deba@2514
   936
    }
deba@2514
   937
deba@2514
   938
    /// \brief Runs the Goldberg-Tarjan algorithm.  
deba@2514
   939
    ///
deba@2514
   940
    /// Runs the Goldberg-Tarjan algorithm.
deba@2514
   941
    /// \note pf.run() is just a shortcut of the following code.
deba@2514
   942
    /// \code
deba@2514
   943
    ///   pf.init();
deba@2514
   944
    ///   pf.startFirstPhase();
deba@2514
   945
    ///   pf.startSecondPhase();
deba@2514
   946
    /// \endcode
deba@2514
   947
    void run() {
deba@2514
   948
      init();
deba@2514
   949
      startFirstPhase();
deba@2514
   950
      startSecondPhase();
deba@2514
   951
    }
deba@2514
   952
deba@2514
   953
    /// \brief Runs the Goldberg-Tarjan algorithm to compute the minimum cut.  
deba@2514
   954
    ///
deba@2514
   955
    /// Runs the Goldberg-Tarjan algorithm to compute the minimum cut.
deba@2514
   956
    /// \note pf.runMinCut() is just a shortcut of the following code.
deba@2514
   957
    /// \code
deba@2514
   958
    ///   pf.init();
deba@2514
   959
    ///   pf.startFirstPhase();
deba@2514
   960
    /// \endcode
deba@2514
   961
    void runMinCut() {
deba@2514
   962
      init();
deba@2514
   963
      startFirstPhase();
deba@2514
   964
    }
deba@2514
   965
deba@2514
   966
    /// @}
deba@2514
   967
deba@2522
   968
    /// \name Query Functions 
deba@2522
   969
    /// The result of the Goldberg-Tarjan algorithm can be obtained
deba@2522
   970
    /// using these functions.
deba@2522
   971
    /// \n
deba@2522
   972
    /// Before the use of these functions, either run() or start() must
deba@2522
   973
    /// be called.
deba@2514
   974
    
deba@2514
   975
    ///@{
deba@2514
   976
deba@2514
   977
    /// \brief Returns the value of the maximum flow.
deba@2514
   978
    ///
deba@2514
   979
    /// Returns the value of the maximum flow by returning the excess
deba@2514
   980
    /// of the target node \c t. This value equals to the value of
deba@2514
   981
    /// the maximum flow already after the first phase.
deba@2514
   982
    Value flowValue() const {
deba@2514
   983
      return (*_excess)[_target];
deba@2514
   984
    }
deba@2514
   985
deba@2514
   986
    /// \brief Returns true when the node is on the source side of minimum cut.
deba@2514
   987
    ///
deba@2514
   988
    /// Returns true when the node is on the source side of minimum
deba@2514
   989
    /// cut. This method can be called both after running \ref
deba@2514
   990
    /// startFirstPhase() and \ref startSecondPhase().
deba@2514
   991
    bool minCut(const Node& node) const {
deba@2514
   992
      return ((*_level)[node] == _level->maxLevel()) == _phase;
deba@2514
   993
    }
deba@2514
   994
 
deba@2514
   995
    /// \brief Returns a minimum value cut.
deba@2514
   996
    ///
deba@2514
   997
    /// Sets the \c cutMap to the characteristic vector of a minimum value
deba@2514
   998
    /// cut. This method can be called both after running \ref
deba@2514
   999
    /// startFirstPhase() and \ref startSecondPhase(). The result after second
deba@2514
  1000
    /// phase could be changed slightly if inexact computation is used.
deba@2514
  1001
    /// \pre The \c cutMap should be a bool-valued node-map.
deba@2514
  1002
    template <typename CutMap>
deba@2514
  1003
    void minCutMap(CutMap& cutMap) const {
deba@2514
  1004
      for (NodeIt n(_graph); n != INVALID; ++n) {
deba@2514
  1005
	cutMap.set(n, minCut(n));
deba@2514
  1006
      }
deba@2514
  1007
    }
deba@2514
  1008
deba@2514
  1009
    /// \brief Returns the flow on the edge.
deba@2514
  1010
    ///
deba@2514
  1011
    /// Sets the \c flowMap to the flow on the edges. This method can
deba@2514
  1012
    /// be called after the second phase of algorithm.
deba@2514
  1013
    Value flow(const Edge& edge) const {
deba@2514
  1014
      return (*_flow)[edge];
deba@2514
  1015
    }
deba@2514
  1016
deba@2514
  1017
    /// @}
deba@2514
  1018
deba@2514
  1019
  }; 
deba@2514
  1020
  
deba@2514
  1021
} //namespace lemon
deba@2514
  1022
deba@2514
  1023
#endif