Index: lemon/Makefile.am
===================================================================
--- lemon/Makefile.am	(revision 700)
+++ lemon/Makefile.am	(revision 701)
@@ -58,7 +58,7 @@
 	lemon/arg_parser.h \
 	lemon/assert.h \
-	lemon/bellman_ford.h \
 	lemon/bfs.h \
 	lemon/bin_heap.h \
+	lemon/binom_heap.h \
 	lemon/bucket_heap.h \
 	lemon/cbc.h \
@@ -80,4 +80,5 @@
 	lemon/euler.h \
 	lemon/fib_heap.h \
+	lemon/fourary_heap.h \
 	lemon/full_graph.h \
 	lemon/glpk.h \
@@ -86,4 +87,5 @@
 	lemon/grid_graph.h \
 	lemon/hypercube_graph.h \
+	lemon/kary_heap.h \
 	lemon/kruskal.h \
 	lemon/hao_orlin.h \
@@ -94,4 +96,5 @@
 	lemon/lp_base.h \
 	lemon/lp_skeleton.h \
+	lemon/list_graph.h \
 	lemon/maps.h \
 	lemon/matching.h \
@@ -100,4 +103,5 @@
 	lemon/nauty_reader.h \
 	lemon/network_simplex.h \
+	lemon/pairing_heap.h \
 	lemon/path.h \
 	lemon/preflow.h \
Index: lemon/bellman_ford.h
===================================================================
--- lemon/bellman_ford.h	(revision 699)
+++ 	(revision )
@@ -1,1100 +1,0 @@
-/* -*- C++ -*-
- *
- * This file is a part of LEMON, a generic C++ optimization library
- *
- * Copyright (C) 2003-2008
- * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
- * (Egervary Research Group on Combinatorial Optimization, EGRES).
- *
- * Permission to use, modify and distribute this software is granted
- * provided that this copyright notice appears in all copies. For
- * precise terms see the accompanying LICENSE file.
- *
- * This software is provided "AS IS" with no warranty of any kind,
- * express or implied, and with no claim as to its suitability for any
- * purpose.
- *
- */
-
-#ifndef LEMON_BELLMAN_FORD_H
-#define LEMON_BELLMAN_FORD_H
-
-/// \ingroup shortest_path
-/// \file
-/// \brief Bellman-Ford algorithm.
-
-#include <lemon/bits/path_dump.h>
-#include <lemon/core.h>
-#include <lemon/error.h>
-#include <lemon/maps.h>
-#include <lemon/path.h>
-
-#include <limits>
-
-namespace lemon {
-
-  /// \brief Default OperationTraits for the BellmanFord algorithm class.
-  ///  
-  /// This operation traits class defines all computational operations
-  /// and constants that are used in the Bellman-Ford algorithm.
-  /// The default implementation is based on the \c numeric_limits class.
-  /// If the numeric type does not have infinity value, then the maximum
-  /// value is used as extremal infinity value.
-  template <
-    typename V, 
-    bool has_inf = std::numeric_limits<V>::has_infinity>
-  struct BellmanFordDefaultOperationTraits {
-    /// \e
-    typedef V Value;
-    /// \brief Gives back the zero value of the type.
-    static Value zero() {
-      return static_cast<Value>(0);
-    }
-    /// \brief Gives back the positive infinity value of the type.
-    static Value infinity() {
-      return std::numeric_limits<Value>::infinity();
-    }
-    /// \brief Gives back the sum of the given two elements.
-    static Value plus(const Value& left, const Value& right) {
-      return left + right;
-    }
-    /// \brief Gives back \c true only if the first value is less than
-    /// the second.
-    static bool less(const Value& left, const Value& right) {
-      return left < right;
-    }
-  };
-
-  template <typename V>
-  struct BellmanFordDefaultOperationTraits<V, false> {
-    typedef V Value;
-    static Value zero() {
-      return static_cast<Value>(0);
-    }
-    static Value infinity() {
-      return std::numeric_limits<Value>::max();
-    }
-    static Value plus(const Value& left, const Value& right) {
-      if (left == infinity() || right == infinity()) return infinity();
-      return left + right;
-    }
-    static bool less(const Value& left, const Value& right) {
-      return left < right;
-    }
-  };
-  
-  /// \brief Default traits class of BellmanFord class.
-  ///
-  /// Default traits class of BellmanFord class.
-  /// \param GR The type of the digraph.
-  /// \param LEN The type of the length map.
-  template<typename GR, typename LEN>
-  struct BellmanFordDefaultTraits {
-    /// The type of the digraph the algorithm runs on. 
-    typedef GR Digraph;
-
-    /// \brief The type of the map that stores the arc lengths.
-    ///
-    /// The type of the map that stores the arc lengths.
-    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
-    typedef LEN LengthMap;
-
-    /// The type of the arc lengths.
-    typedef typename LEN::Value Value;
-
-    /// \brief Operation traits for Bellman-Ford algorithm.
-    ///
-    /// It defines the used operations and the infinity value for the
-    /// given \c Value type.
-    /// \see BellmanFordDefaultOperationTraits
-    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
- 
-    /// \brief The type of the map that stores the last arcs of the 
-    /// shortest paths.
-    /// 
-    /// The type of the map that stores the last
-    /// arcs of the shortest paths.
-    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
-    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
-
-    /// \brief Instantiates a \c PredMap.
-    /// 
-    /// This function instantiates a \ref PredMap. 
-    /// \param g is the digraph to which we would like to define the
-    /// \ref PredMap.
-    static PredMap *createPredMap(const GR& g) {
-      return new PredMap(g);
-    }
-
-    /// \brief The type of the map that stores the distances of the nodes.
-    ///
-    /// The type of the map that stores the distances of the nodes.
-    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
-    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
-
-    /// \brief Instantiates a \c DistMap.
-    ///
-    /// This function instantiates a \ref DistMap. 
-    /// \param g is the digraph to which we would like to define the 
-    /// \ref DistMap.
-    static DistMap *createDistMap(const GR& g) {
-      return new DistMap(g);
-    }
-
-  };
-  
-  /// \brief %BellmanFord algorithm class.
-  ///
-  /// \ingroup shortest_path
-  /// This class provides an efficient implementation of the Bellman-Ford 
-  /// algorithm. The maximum time complexity of the algorithm is
-  /// <tt>O(ne)</tt>.
-  ///
-  /// The Bellman-Ford algorithm solves the single-source shortest path
-  /// problem when the arcs can have negative lengths, but the digraph
-  /// should not contain directed cycles with negative total length.
-  /// If all arc costs are non-negative, consider to use the Dijkstra
-  /// algorithm instead, since it is more efficient.
-  ///
-  /// The arc lengths are passed to the algorithm using a
-  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
-  /// kind of length. The type of the length values is determined by the
-  /// \ref concepts::ReadMap::Value "Value" type of the length map.
-  ///
-  /// There is also a \ref bellmanFord() "function-type interface" for the
-  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
-  /// it can be used easier.
-  ///
-  /// \tparam GR The type of the digraph the algorithm runs on.
-  /// The default type is \ref ListDigraph.
-  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
-  /// the lengths of the arcs. The default map type is
-  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
-#ifdef DOXYGEN
-  template <typename GR, typename LEN, typename TR>
-#else
-  template <typename GR=ListDigraph,
-            typename LEN=typename GR::template ArcMap<int>,
-            typename TR=BellmanFordDefaultTraits<GR,LEN> >
-#endif
-  class BellmanFord {
-  public:
-
-    ///The type of the underlying digraph.
-    typedef typename TR::Digraph Digraph;
-    
-    /// \brief The type of the arc lengths.
-    typedef typename TR::LengthMap::Value Value;
-    /// \brief The type of the map that stores the arc lengths.
-    typedef typename TR::LengthMap LengthMap;
-    /// \brief The type of the map that stores the last
-    /// arcs of the shortest paths.
-    typedef typename TR::PredMap PredMap;
-    /// \brief The type of the map that stores the distances of the nodes.
-    typedef typename TR::DistMap DistMap;
-    /// The type of the paths.
-    typedef PredMapPath<Digraph, PredMap> Path;
-    ///\brief The \ref BellmanFordDefaultOperationTraits
-    /// "operation traits class" of the algorithm.
-    typedef typename TR::OperationTraits OperationTraits;
-
-    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
-    typedef TR Traits;
-
-  private:
-
-    typedef typename Digraph::Node Node;
-    typedef typename Digraph::NodeIt NodeIt;
-    typedef typename Digraph::Arc Arc;
-    typedef typename Digraph::OutArcIt OutArcIt;
-
-    // Pointer to the underlying digraph.
-    const Digraph *_gr;
-    // Pointer to the length map
-    const LengthMap *_length;
-    // Pointer to the map of predecessors arcs.
-    PredMap *_pred;
-    // Indicates if _pred is locally allocated (true) or not.
-    bool _local_pred;
-    // Pointer to the map of distances.
-    DistMap *_dist;
-    // Indicates if _dist is locally allocated (true) or not.
-    bool _local_dist;
-
-    typedef typename Digraph::template NodeMap<bool> MaskMap;
-    MaskMap *_mask;
-
-    std::vector<Node> _process;
-
-    // Creates the maps if necessary.
-    void create_maps() {
-      if(!_pred) {
-	_local_pred = true;
-	_pred = Traits::createPredMap(*_gr);
-      }
-      if(!_dist) {
-	_local_dist = true;
-	_dist = Traits::createDistMap(*_gr);
-      }
-      _mask = new MaskMap(*_gr, false);
-    }
-    
-  public :
- 
-    typedef BellmanFord Create;
-
-    /// \name Named Template Parameters
-
-    ///@{
-
-    template <class T>
-    struct SetPredMapTraits : public Traits {
-      typedef T PredMap;
-      static PredMap *createPredMap(const Digraph&) {
-        LEMON_ASSERT(false, "PredMap is not initialized");
-        return 0; // ignore warnings
-      }
-    };
-
-    /// \brief \ref named-templ-param "Named parameter" for setting
-    /// \c PredMap type.
-    ///
-    /// \ref named-templ-param "Named parameter" for setting
-    /// \c PredMap type.
-    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
-    template <class T>
-    struct SetPredMap 
-      : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > {
-      typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create;
-    };
-    
-    template <class T>
-    struct SetDistMapTraits : public Traits {
-      typedef T DistMap;
-      static DistMap *createDistMap(const Digraph&) {
-        LEMON_ASSERT(false, "DistMap is not initialized");
-        return 0; // ignore warnings
-      }
-    };
-
-    /// \brief \ref named-templ-param "Named parameter" for setting
-    /// \c DistMap type.
-    ///
-    /// \ref named-templ-param "Named parameter" for setting
-    /// \c DistMap type.
-    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
-    template <class T>
-    struct SetDistMap 
-      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
-      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
-    };
-
-    template <class T>
-    struct SetOperationTraitsTraits : public Traits {
-      typedef T OperationTraits;
-    };
-    
-    /// \brief \ref named-templ-param "Named parameter" for setting 
-    /// \c OperationTraits type.
-    ///
-    /// \ref named-templ-param "Named parameter" for setting
-    /// \c OperationTraits type.
-    /// For more information see \ref BellmanFordDefaultOperationTraits.
-    template <class T>
-    struct SetOperationTraits
-      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
-      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
-      Create;
-    };
-    
-    ///@}
-
-  protected:
-    
-    BellmanFord() {}
-
-  public:      
-    
-    /// \brief Constructor.
-    ///
-    /// Constructor.
-    /// \param g The digraph the algorithm runs on.
-    /// \param length The length map used by the algorithm.
-    BellmanFord(const Digraph& g, const LengthMap& length) :
-      _gr(&g), _length(&length),
-      _pred(0), _local_pred(false),
-      _dist(0), _local_dist(false), _mask(0) {}
-    
-    ///Destructor.
-    ~BellmanFord() {
-      if(_local_pred) delete _pred;
-      if(_local_dist) delete _dist;
-      if(_mask) delete _mask;
-    }
-
-    /// \brief Sets the length map.
-    ///
-    /// Sets the length map.
-    /// \return <tt>(*this)</tt>
-    BellmanFord &lengthMap(const LengthMap &map) {
-      _length = &map;
-      return *this;
-    }
-
-    /// \brief Sets the map that stores the predecessor arcs.
-    ///
-    /// Sets the map that stores the predecessor arcs.
-    /// If you don't use this function before calling \ref run()
-    /// or \ref init(), an instance will be allocated automatically.
-    /// The destructor deallocates this automatically allocated map,
-    /// of course.
-    /// \return <tt>(*this)</tt>
-    BellmanFord &predMap(PredMap &map) {
-      if(_local_pred) {
-	delete _pred;
-	_local_pred=false;
-      }
-      _pred = &map;
-      return *this;
-    }
-
-    /// \brief Sets the map that stores the distances of the nodes.
-    ///
-    /// Sets the map that stores the distances of the nodes calculated
-    /// by the algorithm.
-    /// If you don't use this function before calling \ref run()
-    /// or \ref init(), an instance will be allocated automatically.
-    /// The destructor deallocates this automatically allocated map,
-    /// of course.
-    /// \return <tt>(*this)</tt>
-    BellmanFord &distMap(DistMap &map) {
-      if(_local_dist) {
-	delete _dist;
-	_local_dist=false;
-      }
-      _dist = &map;
-      return *this;
-    }
-
-    /// \name Execution Control
-    /// The simplest way to execute the Bellman-Ford algorithm is to use
-    /// one of the member functions called \ref run().\n
-    /// If you need better control on the execution, you have to call
-    /// \ref init() first, then you can add several source nodes
-    /// with \ref addSource(). Finally the actual path computation can be
-    /// performed with \ref start(), \ref checkedStart() or
-    /// \ref limitedStart().
-
-    ///@{
-
-    /// \brief Initializes the internal data structures.
-    /// 
-    /// Initializes the internal data structures. The optional parameter
-    /// is the initial distance of each node.
-    void init(const Value value = OperationTraits::infinity()) {
-      create_maps();
-      for (NodeIt it(*_gr); it != INVALID; ++it) {
-	_pred->set(it, INVALID);
-	_dist->set(it, value);
-      }
-      _process.clear();
-      if (OperationTraits::less(value, OperationTraits::infinity())) {
-	for (NodeIt it(*_gr); it != INVALID; ++it) {
-	  _process.push_back(it);
-	  _mask->set(it, true);
-	}
-      }
-    }
-    
-    /// \brief Adds a new source node.
-    ///
-    /// This function adds a new source node. The optional second parameter
-    /// is the initial distance of the node.
-    void addSource(Node source, Value dst = OperationTraits::zero()) {
-      _dist->set(source, dst);
-      if (!(*_mask)[source]) {
-	_process.push_back(source);
-	_mask->set(source, true);
-      }
-    }
-
-    /// \brief Executes one round from the Bellman-Ford algorithm.
-    ///
-    /// If the algoritm calculated the distances in the previous round
-    /// exactly for the paths of at most \c k arcs, then this function
-    /// will calculate the distances exactly for the paths of at most
-    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
-    /// calculates the shortest path distances exactly for the paths
-    /// consisting of at most \c k arcs.
-    ///
-    /// \warning The paths with limited arc number cannot be retrieved
-    /// easily with \ref path() or \ref predArc() functions. If you also
-    /// need the shortest paths and not only the distances, you should
-    /// store the \ref predMap() "predecessor map" after each iteration
-    /// and build the path manually.
-    ///
-    /// \return \c true when the algorithm have not found more shorter
-    /// paths.
-    ///
-    /// \see ActiveIt
-    bool processNextRound() {
-      for (int i = 0; i < int(_process.size()); ++i) {
-	_mask->set(_process[i], false);
-      }
-      std::vector<Node> nextProcess;
-      std::vector<Value> values(_process.size());
-      for (int i = 0; i < int(_process.size()); ++i) {
-	values[i] = (*_dist)[_process[i]];
-      }
-      for (int i = 0; i < int(_process.size()); ++i) {
-	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
-	  Node target = _gr->target(it);
-	  Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
-	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
-	    _pred->set(target, it);
-	    _dist->set(target, relaxed);
-	    if (!(*_mask)[target]) {
-	      _mask->set(target, true);
-	      nextProcess.push_back(target);
-	    }
-	  }	  
-	}
-      }
-      _process.swap(nextProcess);
-      return _process.empty();
-    }
-
-    /// \brief Executes one weak round from the Bellman-Ford algorithm.
-    ///
-    /// If the algorithm calculated the distances in the previous round
-    /// at least for the paths of at most \c k arcs, then this function
-    /// will calculate the distances at least for the paths of at most
-    /// <tt>k+1</tt> arcs.
-    /// This function does not make it possible to calculate the shortest
-    /// path distances exactly for paths consisting of at most \c k arcs,
-    /// this is why it is called weak round.
-    ///
-    /// \return \c true when the algorithm have not found more shorter
-    /// paths.
-    ///
-    /// \see ActiveIt
-    bool processNextWeakRound() {
-      for (int i = 0; i < int(_process.size()); ++i) {
-	_mask->set(_process[i], false);
-      }
-      std::vector<Node> nextProcess;
-      for (int i = 0; i < int(_process.size()); ++i) {
-	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
-	  Node target = _gr->target(it);
-	  Value relaxed = 
-	    OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
-	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
-	    _pred->set(target, it);
-	    _dist->set(target, relaxed);
-	    if (!(*_mask)[target]) {
-	      _mask->set(target, true);
-	      nextProcess.push_back(target);
-	    }
-	  }	  
-	}
-      }
-      _process.swap(nextProcess);
-      return _process.empty();
-    }
-
-    /// \brief Executes the algorithm.
-    ///
-    /// Executes the algorithm.
-    ///
-    /// This method runs the Bellman-Ford algorithm from the root node(s)
-    /// in order to compute the shortest path to each node.
-    ///
-    /// The algorithm computes
-    /// - the shortest path tree (forest),
-    /// - the distance of each node from the root(s).
-    ///
-    /// \pre init() must be called and at least one root node should be
-    /// added with addSource() before using this function.
-    void start() {
-      int num = countNodes(*_gr) - 1;
-      for (int i = 0; i < num; ++i) {
-	if (processNextWeakRound()) break;
-      }
-    }
-
-    /// \brief Executes the algorithm and checks the negative cycles.
-    ///
-    /// Executes the algorithm and checks the negative cycles.
-    ///
-    /// This method runs the Bellman-Ford algorithm from the root node(s)
-    /// in order to compute the shortest path to each node and also checks
-    /// if the digraph contains cycles with negative total length.
-    ///
-    /// The algorithm computes 
-    /// - the shortest path tree (forest),
-    /// - the distance of each node from the root(s).
-    /// 
-    /// \return \c false if there is a negative cycle in the digraph.
-    ///
-    /// \pre init() must be called and at least one root node should be
-    /// added with addSource() before using this function. 
-    bool checkedStart() {
-      int num = countNodes(*_gr);
-      for (int i = 0; i < num; ++i) {
-	if (processNextWeakRound()) return true;
-      }
-      return _process.empty();
-    }
-
-    /// \brief Executes the algorithm with arc number limit.
-    ///
-    /// Executes the algorithm with arc number limit.
-    ///
-    /// This method runs the Bellman-Ford algorithm from the root node(s)
-    /// in order to compute the shortest path distance for each node
-    /// using only the paths consisting of at most \c num arcs.
-    ///
-    /// The algorithm computes
-    /// - the limited distance of each node from the root(s),
-    /// - the predecessor arc for each node.
-    ///
-    /// \warning The paths with limited arc number cannot be retrieved
-    /// easily with \ref path() or \ref predArc() functions. If you also
-    /// need the shortest paths and not only the distances, you should
-    /// store the \ref predMap() "predecessor map" after each iteration
-    /// and build the path manually.
-    ///
-    /// \pre init() must be called and at least one root node should be
-    /// added with addSource() before using this function. 
-    void limitedStart(int num) {
-      for (int i = 0; i < num; ++i) {
-	if (processNextRound()) break;
-      }
-    }
-    
-    /// \brief Runs the algorithm from the given root node.
-    ///    
-    /// This method runs the Bellman-Ford algorithm from the given root
-    /// node \c s in order to compute the shortest path to each node.
-    ///
-    /// The algorithm computes
-    /// - the shortest path tree (forest),
-    /// - the distance of each node from the root(s).
-    ///
-    /// \note bf.run(s) is just a shortcut of the following code.
-    /// \code
-    ///   bf.init();
-    ///   bf.addSource(s);
-    ///   bf.start();
-    /// \endcode
-    void run(Node s) {
-      init();
-      addSource(s);
-      start();
-    }
-    
-    /// \brief Runs the algorithm from the given root node with arc
-    /// number limit.
-    ///    
-    /// This method runs the Bellman-Ford algorithm from the given root
-    /// node \c s in order to compute the shortest path distance for each
-    /// node using only the paths consisting of at most \c num arcs.
-    ///
-    /// The algorithm computes
-    /// - the limited distance of each node from the root(s),
-    /// - the predecessor arc for each node.
-    ///
-    /// \warning The paths with limited arc number cannot be retrieved
-    /// easily with \ref path() or \ref predArc() functions. If you also
-    /// need the shortest paths and not only the distances, you should
-    /// store the \ref predMap() "predecessor map" after each iteration
-    /// and build the path manually.
-    ///
-    /// \note bf.run(s, num) is just a shortcut of the following code.
-    /// \code
-    ///   bf.init();
-    ///   bf.addSource(s);
-    ///   bf.limitedStart(num);
-    /// \endcode
-    void run(Node s, int num) {
-      init();
-      addSource(s);
-      limitedStart(num);
-    }
-    
-    ///@}
-
-    /// \brief LEMON iterator for getting the active nodes.
-    ///
-    /// This class provides a common style LEMON iterator that traverses
-    /// the active nodes of the Bellman-Ford algorithm after the last
-    /// phase. These nodes should be checked in the next phase to
-    /// find augmenting arcs outgoing from them.
-    class ActiveIt {
-    public:
-
-      /// \brief Constructor.
-      ///
-      /// Constructor for getting the active nodes of the given BellmanFord
-      /// instance. 
-      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
-      {
-        _index = _algorithm->_process.size() - 1;
-      }
-
-      /// \brief Invalid constructor.
-      ///
-      /// Invalid constructor.
-      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
-
-      /// \brief Conversion to \c Node.
-      ///
-      /// Conversion to \c Node.
-      operator Node() const { 
-        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
-      }
-
-      /// \brief Increment operator.
-      ///
-      /// Increment operator.
-      ActiveIt& operator++() {
-        --_index;
-        return *this; 
-      }
-
-      bool operator==(const ActiveIt& it) const { 
-        return static_cast<Node>(*this) == static_cast<Node>(it); 
-      }
-      bool operator!=(const ActiveIt& it) const { 
-        return static_cast<Node>(*this) != static_cast<Node>(it); 
-      }
-      bool operator<(const ActiveIt& it) const { 
-        return static_cast<Node>(*this) < static_cast<Node>(it); 
-      }
-      
-    private:
-      const BellmanFord* _algorithm;
-      int _index;
-    };
-    
-    /// \name Query Functions
-    /// The result of the Bellman-Ford algorithm can be obtained using these
-    /// functions.\n
-    /// Either \ref run() or \ref init() should be called before using them.
-    
-    ///@{
-
-    /// \brief The shortest path to the given node.
-    ///    
-    /// Gives back the shortest path to the given node from the root(s).
-    ///
-    /// \warning \c t should be reached from the root(s).
-    ///
-    /// \pre Either \ref run() or \ref init() must be called before
-    /// using this function.
-    Path path(Node t) const
-    {
-      return Path(*_gr, *_pred, t);
-    }
-	  
-    /// \brief The distance of the given node from the root(s).
-    ///
-    /// Returns the distance of the given node from the root(s).
-    ///
-    /// \warning If node \c v is not reached from the root(s), then
-    /// the return value of this function is undefined.
-    ///
-    /// \pre Either \ref run() or \ref init() must be called before
-    /// using this function.
-    Value dist(Node v) const { return (*_dist)[v]; }
-
-    /// \brief Returns the 'previous arc' of the shortest path tree for
-    /// the given node.
-    ///
-    /// This function returns the 'previous arc' of the shortest path
-    /// tree for node \c v, i.e. it returns the last arc of a
-    /// shortest path from a root to \c v. It is \c INVALID if \c v
-    /// is not reached from the root(s) or if \c v is a root.
-    ///
-    /// The shortest path tree used here is equal to the shortest path
-    /// tree used in \ref predNode() and \predMap().
-    ///
-    /// \pre Either \ref run() or \ref init() must be called before
-    /// using this function.
-    Arc predArc(Node v) const { return (*_pred)[v]; }
-
-    /// \brief Returns the 'previous node' of the shortest path tree for
-    /// the given node.
-    ///
-    /// This function returns the 'previous node' of the shortest path
-    /// tree for node \c v, i.e. it returns the last but one node of
-    /// a shortest path from a root to \c v. It is \c INVALID if \c v
-    /// is not reached from the root(s) or if \c v is a root.
-    ///
-    /// The shortest path tree used here is equal to the shortest path
-    /// tree used in \ref predArc() and \predMap().
-    ///
-    /// \pre Either \ref run() or \ref init() must be called before
-    /// using this function.
-    Node predNode(Node v) const { 
-      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 
-    }
-    
-    /// \brief Returns a const reference to the node map that stores the
-    /// distances of the nodes.
-    ///
-    /// Returns a const reference to the node map that stores the distances
-    /// of the nodes calculated by the algorithm.
-    ///
-    /// \pre Either \ref run() or \ref init() must be called before
-    /// using this function.
-    const DistMap &distMap() const { return *_dist;}
- 
-    /// \brief Returns a const reference to the node map that stores the
-    /// predecessor arcs.
-    ///
-    /// Returns a const reference to the node map that stores the predecessor
-    /// arcs, which form the shortest path tree (forest).
-    ///
-    /// \pre Either \ref run() or \ref init() must be called before
-    /// using this function.
-    const PredMap &predMap() const { return *_pred; }
- 
-    /// \brief Checks if a node is reached from the root(s).
-    ///
-    /// Returns \c true if \c v is reached from the root(s).
-    ///
-    /// \pre Either \ref run() or \ref init() must be called before
-    /// using this function.
-    bool reached(Node v) const {
-      return (*_dist)[v] != OperationTraits::infinity();
-    }
-
-    /// \brief Gives back a negative cycle.
-    ///    
-    /// This function gives back a directed cycle with negative total
-    /// length if the algorithm has already found one.
-    /// Otherwise it gives back an empty path.
-    lemon::Path<Digraph> negativeCycle() {
-      typename Digraph::template NodeMap<int> state(*_gr, -1);
-      lemon::Path<Digraph> cycle;
-      for (int i = 0; i < int(_process.size()); ++i) {
-        if (state[_process[i]] != -1) continue;
-        for (Node v = _process[i]; (*_pred)[v] != INVALID;
-             v = _gr->source((*_pred)[v])) {
-          if (state[v] == i) {
-            cycle.addFront((*_pred)[v]);
-            for (Node u = _gr->source((*_pred)[v]); u != v;
-                 u = _gr->source((*_pred)[u])) {
-              cycle.addFront((*_pred)[u]);
-            }
-            return cycle;
-          }
-          else if (state[v] >= 0) {
-            break;
-          }
-          state[v] = i;
-        }
-      }
-      return cycle;
-    }
-    
-    ///@}
-  };
- 
-  /// \brief Default traits class of bellmanFord() function.
-  ///
-  /// Default traits class of bellmanFord() function.
-  /// \tparam GR The type of the digraph.
-  /// \tparam LEN The type of the length map.
-  template <typename GR, typename LEN>
-  struct BellmanFordWizardDefaultTraits {
-    /// The type of the digraph the algorithm runs on. 
-    typedef GR Digraph;
-
-    /// \brief The type of the map that stores the arc lengths.
-    ///
-    /// The type of the map that stores the arc lengths.
-    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
-    typedef LEN LengthMap;
-
-    /// The type of the arc lengths.
-    typedef typename LEN::Value Value;
-
-    /// \brief Operation traits for Bellman-Ford algorithm.
-    ///
-    /// It defines the used operations and the infinity value for the
-    /// given \c Value type.
-    /// \see BellmanFordDefaultOperationTraits
-    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
-
-    /// \brief The type of the map that stores the last
-    /// arcs of the shortest paths.
-    /// 
-    /// The type of the map that stores the last arcs of the shortest paths.
-    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
-    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
-
-    /// \brief Instantiates a \c PredMap.
-    /// 
-    /// This function instantiates a \ref PredMap.
-    /// \param g is the digraph to which we would like to define the
-    /// \ref PredMap.
-    static PredMap *createPredMap(const GR &g) {
-      return new PredMap(g);
-    }
-
-    /// \brief The type of the map that stores the distances of the nodes.
-    ///
-    /// The type of the map that stores the distances of the nodes.
-    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
-    typedef typename GR::template NodeMap<Value> DistMap;
-
-    /// \brief Instantiates a \c DistMap.
-    ///
-    /// This function instantiates a \ref DistMap. 
-    /// \param g is the digraph to which we would like to define the
-    /// \ref DistMap.
-    static DistMap *createDistMap(const GR &g) {
-      return new DistMap(g);
-    }
-
-    ///The type of the shortest paths.
-
-    ///The type of the shortest paths.
-    ///It must meet the \ref concepts::Path "Path" concept.
-    typedef lemon::Path<Digraph> Path;
-  };
-  
-  /// \brief Default traits class used by BellmanFordWizard.
-  ///
-  /// Default traits class used by BellmanFordWizard.
-  /// \tparam GR The type of the digraph.
-  /// \tparam LEN The type of the length map.
-  template <typename GR, typename LEN>
-  class BellmanFordWizardBase 
-    : public BellmanFordWizardDefaultTraits<GR, LEN> {
-
-    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
-  protected:
-    // Type of the nodes in the digraph.
-    typedef typename Base::Digraph::Node Node;
-
-    // Pointer to the underlying digraph.
-    void *_graph;
-    // Pointer to the length map
-    void *_length;
-    // Pointer to the map of predecessors arcs.
-    void *_pred;
-    // Pointer to the map of distances.
-    void *_dist;
-    //Pointer to the shortest path to the target node.
-    void *_path;
-    //Pointer to the distance of the target node.
-    void *_di;
-
-    public:
-    /// Constructor.
-    
-    /// This constructor does not require parameters, it initiates
-    /// all of the attributes to default values \c 0.
-    BellmanFordWizardBase() :
-      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
-
-    /// Constructor.
-    
-    /// This constructor requires two parameters,
-    /// others are initiated to \c 0.
-    /// \param gr The digraph the algorithm runs on.
-    /// \param len The length map.
-    BellmanFordWizardBase(const GR& gr, 
-			  const LEN& len) :
-      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 
-      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 
-      _pred(0), _dist(0), _path(0), _di(0) {}
-
-  };
-  
-  /// \brief Auxiliary class for the function-type interface of the
-  /// \ref BellmanFord "Bellman-Ford" algorithm.
-  ///
-  /// This auxiliary class is created to implement the
-  /// \ref bellmanFord() "function-type interface" of the
-  /// \ref BellmanFord "Bellman-Ford" algorithm.
-  /// It does not have own \ref run() method, it uses the
-  /// functions and features of the plain \ref BellmanFord.
-  ///
-  /// This class should only be used through the \ref bellmanFord()
-  /// function, which makes it easier to use the algorithm.
-  template<class TR>
-  class BellmanFordWizard : public TR {
-    typedef TR Base;
-
-    typedef typename TR::Digraph Digraph;
-
-    typedef typename Digraph::Node Node;
-    typedef typename Digraph::NodeIt NodeIt;
-    typedef typename Digraph::Arc Arc;
-    typedef typename Digraph::OutArcIt ArcIt;
-    
-    typedef typename TR::LengthMap LengthMap;
-    typedef typename LengthMap::Value Value;
-    typedef typename TR::PredMap PredMap;
-    typedef typename TR::DistMap DistMap;
-    typedef typename TR::Path Path;
-
-  public:
-    /// Constructor.
-    BellmanFordWizard() : TR() {}
-
-    /// \brief Constructor that requires parameters.
-    ///
-    /// Constructor that requires parameters.
-    /// These parameters will be the default values for the traits class.
-    /// \param gr The digraph the algorithm runs on.
-    /// \param len The length map.
-    BellmanFordWizard(const Digraph& gr, const LengthMap& len) 
-      : TR(gr, len) {}
-
-    /// \brief Copy constructor
-    BellmanFordWizard(const TR &b) : TR(b) {}
-
-    ~BellmanFordWizard() {}
-
-    /// \brief Runs the Bellman-Ford algorithm from the given source node.
-    ///    
-    /// This method runs the Bellman-Ford algorithm from the given source
-    /// node in order to compute the shortest path to each node.
-    void run(Node s) {
-      BellmanFord<Digraph,LengthMap,TR> 
-	bf(*reinterpret_cast<const Digraph*>(Base::_graph), 
-           *reinterpret_cast<const LengthMap*>(Base::_length));
-      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
-      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
-      bf.run(s);
-    }
-
-    /// \brief Runs the Bellman-Ford algorithm to find the shortest path
-    /// between \c s and \c t.
-    ///
-    /// This method runs the Bellman-Ford algorithm from node \c s
-    /// in order to compute the shortest path to node \c t.
-    /// Actually, it computes the shortest path to each node, but using
-    /// this function you can retrieve the distance and the shortest path
-    /// for a single target node easier.
-    ///
-    /// \return \c true if \c t is reachable form \c s.
-    bool run(Node s, Node t) {
-      BellmanFord<Digraph,LengthMap,TR>
-        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
-           *reinterpret_cast<const LengthMap*>(Base::_length));
-      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
-      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
-      bf.run(s);
-      if (Base::_path) *reinterpret_cast<Path*>(Base::_path) = bf.path(t);
-      if (Base::_di) *reinterpret_cast<Value*>(Base::_di) = bf.dist(t);
-      return bf.reached(t);
-    }
-
-    template<class T>
-    struct SetPredMapBase : public Base {
-      typedef T PredMap;
-      static PredMap *createPredMap(const Digraph &) { return 0; };
-      SetPredMapBase(const TR &b) : TR(b) {}
-    };
-    
-    /// \brief \ref named-templ-param "Named parameter" for setting
-    /// the predecessor map.
-    ///
-    /// \ref named-templ-param "Named parameter" for setting
-    /// the map that stores the predecessor arcs of the nodes.
-    template<class T>
-    BellmanFordWizard<SetPredMapBase<T> > predMap(const T &t) {
-      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
-      return BellmanFordWizard<SetPredMapBase<T> >(*this);
-    }
-    
-    template<class T>
-    struct SetDistMapBase : public Base {
-      typedef T DistMap;
-      static DistMap *createDistMap(const Digraph &) { return 0; };
-      SetDistMapBase(const TR &b) : TR(b) {}
-    };
-    
-    /// \brief \ref named-templ-param "Named parameter" for setting
-    /// the distance map.
-    ///
-    /// \ref named-templ-param "Named parameter" for setting
-    /// the map that stores the distances of the nodes calculated
-    /// by the algorithm.
-    template<class T>
-    BellmanFordWizard<SetDistMapBase<T> > distMap(const T &t) {
-      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
-      return BellmanFordWizard<SetDistMapBase<T> >(*this);
-    }
-
-    template<class T>
-    struct SetPathBase : public Base {
-      typedef T Path;
-      SetPathBase(const TR &b) : TR(b) {}
-    };
-
-    /// \brief \ref named-func-param "Named parameter" for getting
-    /// the shortest path to the target node.
-    ///
-    /// \ref named-func-param "Named parameter" for getting
-    /// the shortest path to the target node.
-    template<class T>
-    BellmanFordWizard<SetPathBase<T> > path(const T &t)
-    {
-      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
-      return BellmanFordWizard<SetPathBase<T> >(*this);
-    }
-
-    /// \brief \ref named-func-param "Named parameter" for getting
-    /// the distance of the target node.
-    ///
-    /// \ref named-func-param "Named parameter" for getting
-    /// the distance of the target node.
-    BellmanFordWizard dist(const Value &d)
-    {
-      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
-      return *this;
-    }
-    
-  };
-  
-  /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford"
-  /// algorithm.
-  ///
-  /// \ingroup shortest_path
-  /// Function type interface for the \ref BellmanFord "Bellman-Ford"
-  /// algorithm.
-  ///
-  /// This function also has several \ref named-templ-func-param 
-  /// "named parameters", they are declared as the members of class 
-  /// \ref BellmanFordWizard.
-  /// The following examples show how to use these parameters.
-  /// \code
-  ///   // Compute shortest path from node s to each node
-  ///   bellmanFord(g,length).predMap(preds).distMap(dists).run(s);
-  ///
-  ///   // Compute shortest path from s to t
-  ///   bool reached = bellmanFord(g,length).path(p).dist(d).run(s,t);
-  /// \endcode
-  /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
-  /// to the end of the parameter list.
-  /// \sa BellmanFordWizard
-  /// \sa BellmanFord
-  template<typename GR, typename LEN>
-  BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >
-  bellmanFord(const GR& digraph,
-	      const LEN& length)
-  {
-    return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length);
-  }
-
-} //END OF NAMESPACE LEMON
-
-#endif
-
Index: lemon/binom_heap.h
===================================================================
--- lemon/binom_heap.h	(revision 701)
+++ lemon/binom_heap.h	(revision 701)
@@ -0,0 +1,506 @@
+/* -*- C++ -*-
+ *
+ * This file is a part of LEMON, a generic C++ optimization library
+ *
+ * Copyright (C) 2003-2008
+ * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Research Group on Combinatorial Optimization, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+#ifndef LEMON_BINOM_HEAP_H
+#define LEMON_BINOM_HEAP_H
+
+///\file
+///\ingroup auxdat
+///\brief Binomial Heap implementation.
+
+#include <vector>
+#include <functional>
+#include <lemon/math.h>
+#include <lemon/counter.h>
+
+namespace lemon {
+
+  /// \ingroup auxdat
+  ///
+  ///\brief Binomial Heap.
+  ///
+  ///This class implements the \e Binomial \e heap data structure. A \e heap
+  ///is a data structure for storing items with specified values called \e
+  ///priorities in such a way that finding the item with minimum priority is
+  ///efficient. \c Compare specifies the ordering of the priorities. In a heap
+  ///one can change the priority of an item, add or erase an item, etc.
+  ///
+  ///The methods \ref increase and \ref erase are not efficient in a Binomial
+  ///heap. In case of many calls to these operations, it is better to use a
+  ///\ref BinHeap "binary heap".
+  ///
+  ///\param _Prio Type of the priority of the items.
+  ///\param _ItemIntMap A read and writable Item int map, used internally
+  ///to handle the cross references.
+  ///\param _Compare A class for the ordering of the priorities. The
+  ///default is \c std::less<_Prio>.
+  ///
+  ///\sa BinHeap
+  ///\sa Dijkstra
+  ///\author Dorian Batha
+
+#ifdef DOXYGEN
+  template <typename _Prio,
+            typename _ItemIntMap,
+            typename _Compare>
+#else
+  template <typename _Prio,
+            typename _ItemIntMap,
+            typename _Compare = std::less<_Prio> >
+#endif
+  class BinomHeap {
+  public:
+    typedef _ItemIntMap ItemIntMap;
+    typedef _Prio Prio;
+    typedef typename ItemIntMap::Key Item;
+    typedef std::pair<Item,Prio> Pair;
+    typedef _Compare Compare;
+
+  private:
+    class store;
+
+    std::vector<store> container;
+    int minimum, head;
+    ItemIntMap &iimap;
+    Compare comp;
+    int num_items;
+
+  public:
+    ///Status of the nodes
+    enum State {
+      ///The node is in the heap
+      IN_HEAP = 0,
+      ///The node has never been in the heap
+      PRE_HEAP = -1,
+      ///The node was in the heap but it got out of it
+      POST_HEAP = -2
+    };
+
+    /// \brief The constructor
+    ///
+    /// \c _iimap should be given to the constructor, since it is
+    ///   used internally to handle the cross references.
+    explicit BinomHeap(ItemIntMap &_iimap)
+      : minimum(0), head(-1), iimap(_iimap), num_items() {}
+
+    /// \brief The constructor
+    ///
+    /// \c _iimap should be given to the constructor, since it is used
+    /// internally to handle the cross references. \c _comp is an
+    /// object for ordering of the priorities.
+    BinomHeap(ItemIntMap &_iimap, const Compare &_comp)
+      : minimum(0), head(-1), iimap(_iimap), comp(_comp), num_items() {}
+
+    /// \brief The number of items stored in the heap.
+    ///
+    /// Returns the number of items stored in the heap.
+    int size() const { return num_items; }
+
+    /// \brief Checks if the heap stores no items.
+    ///
+    ///   Returns \c true if and only if the heap stores no items.
+    bool empty() const { return num_items==0; }
+
+    /// \brief Make empty this heap.
+    ///
+    /// Make empty this heap. It does not change the cross reference
+    /// map.  If you want to reuse a heap what is not surely empty you
+    /// should first clear the heap and after that you should set the
+    /// cross reference map for each item to \c PRE_HEAP.
+    void clear() {
+      container.clear(); minimum=0; num_items=0; head=-1;
+    }
+
+    /// \brief \c item gets to the heap with priority \c value independently
+    /// if \c item was already there.
+    ///
+    /// This method calls \ref push(\c item, \c value) if \c item is not
+    /// stored in the heap and it calls \ref decrease(\c item, \c value) or
+    /// \ref increase(\c item, \c value) otherwise.
+    void set (const Item& item, const Prio& value) {
+      int i=iimap[item];
+      if ( i >= 0 && container[i].in ) {
+        if ( comp(value, container[i].prio) ) decrease(item, value);
+        if ( comp(container[i].prio, value) ) increase(item, value);
+      } else push(item, value);
+    }
+
+    /// \brief Adds \c item to the heap with priority \c value.
+    ///
+    /// Adds \c item to the heap with priority \c value.
+    /// \pre \c item must not be stored in the heap.
+    void push (const Item& item, const Prio& value) {
+      int i=iimap[item];
+      if ( i<0 ) {
+        int s=container.size();
+        iimap.set( item,s );
+        store st;
+        st.name=item;
+        container.push_back(st);
+        i=s;
+      }
+      else {
+        container[i].parent=container[i].right_neighbor=container[i].child=-1;
+        container[i].degree=0;
+        container[i].in=true;
+      }
+      container[i].prio=value;
+
+      if( 0==num_items ) { head=i; minimum=i; }
+      else { merge(i); }
+
+      minimum = find_min();
+
+      ++num_items;
+    }
+
+    /// \brief Returns the item with minimum priority relative to \c Compare.
+    ///
+    /// This method returns the item with minimum priority relative to \c
+    /// Compare.
+    /// \pre The heap must be nonempty.
+    Item top() const { return container[minimum].name; }
+
+    /// \brief Returns the minimum priority relative to \c Compare.
+    ///
+    /// It returns the minimum priority relative to \c Compare.
+    /// \pre The heap must be nonempty.
+    const Prio& prio() const { return container[minimum].prio; }
+
+    /// \brief Returns the priority of \c item.
+    ///
+    /// It returns the priority of \c item.
+    /// \pre \c item must be in the heap.
+    const Prio& operator[](const Item& item) const {
+      return container[iimap[item]].prio;
+    }
+
+    /// \brief Deletes the item with minimum priority relative to \c Compare.
+    ///
+    /// This method deletes the item with minimum priority relative to \c
+    /// Compare from the heap.
+    /// \pre The heap must be non-empty.
+    void pop() {
+      container[minimum].in=false;
+
+      int head_child=-1;
+      if ( container[minimum].child!=-1 ) {
+        int child=container[minimum].child;
+        int neighb;
+        int prev=-1;
+        while( child!=-1 ) {
+          neighb=container[child].right_neighbor;
+          container[child].parent=-1;
+          container[child].right_neighbor=prev;
+          head_child=child;
+          prev=child;
+          child=neighb;
+        }
+      }
+
+      // The first case is that there are only one root.
+      if ( -1==container[head].right_neighbor ) {
+        head=head_child;
+      }
+      // The case where there are more roots.
+      else {
+        if( head!=minimum )  { unlace(minimum); }
+        else { head=container[head].right_neighbor; }
+
+        merge(head_child);
+      }
+      minimum=find_min();
+      --num_items;
+    }
+
+    /// \brief Deletes \c item from the heap.
+    ///
+    /// This method deletes \c item from the heap, if \c item was already
+    /// stored in the heap. It is quite inefficient in Binomial heaps.
+    void erase (const Item& item) {
+      int i=iimap[item];
+      if ( i >= 0 && container[i].in ) {
+        decrease( item, container[minimum].prio-1 );
+        pop();
+      }
+    }
+
+    /// \brief Decreases the priority of \c item to \c value.
+    ///
+    /// This method decreases the priority of \c item to \c value.
+    /// \pre \c item must be stored in the heap with priority at least \c
+    ///   value relative to \c Compare.
+    void decrease (Item item, const Prio& value) {
+      int i=iimap[item];
+
+      if( comp( value,container[i].prio ) ) {
+        container[i].prio=value;
+
+        int p_loc=container[i].parent, loc=i;
+        int parent, child, neighb;
+
+        while( -1!=p_loc && comp(container[loc].prio,container[p_loc].prio) ) {
+
+          // parent set for other loc_child
+          child=container[loc].child;
+          while( -1!=child ) {
+            container[child].parent=p_loc;
+            child=container[child].right_neighbor;
+          }
+
+          // parent set for other p_loc_child
+          child=container[p_loc].child;
+          while( -1!=child ) {
+            container[child].parent=loc;
+            child=container[child].right_neighbor;
+          }
+
+          child=container[p_loc].child;
+          container[p_loc].child=container[loc].child;
+          if( child==loc )
+            child=p_loc;
+          container[loc].child=child;
+
+          // left_neighb set for p_loc
+          if( container[loc].child!=p_loc ) {
+            while( container[child].right_neighbor!=loc )
+              child=container[child].right_neighbor;
+            container[child].right_neighbor=p_loc;
+          }
+
+          // left_neighb set for loc
+          parent=container[p_loc].parent;
+          if( -1!=parent ) child=container[parent].child;
+          else child=head;
+
+          if( child!=p_loc ) {
+            while( container[child].right_neighbor!=p_loc )
+              child=container[child].right_neighbor;
+            container[child].right_neighbor=loc;
+          }
+
+          neighb=container[p_loc].right_neighbor;
+          container[p_loc].right_neighbor=container[loc].right_neighbor;
+          container[loc].right_neighbor=neighb;
+
+          container[p_loc].parent=loc;
+          container[loc].parent=parent;
+
+          if( -1!=parent && container[parent].child==p_loc )
+            container[parent].child=loc;
+
+          /*if new parent will be the first root*/
+          if( head==p_loc )
+            head=loc;
+
+          p_loc=container[loc].parent;
+        }
+      }
+      if( comp(value,container[minimum].prio) ) {
+        minimum=i;
+      }
+    }
+
+    /// \brief Increases the priority of \c item to \c value.
+    ///
+    /// This method sets the priority of \c item to \c value. Though
+    /// there is no precondition on the priority of \c item, this
+    /// method should be used only if it is indeed necessary to increase
+    /// (relative to \c Compare) the priority of \c item, because this
+    /// method is inefficient.
+    void increase (Item item, const Prio& value) {
+      erase(item);
+      push(item, value);
+    }
+
+
+    /// \brief Returns if \c item is in, has already been in, or has never
+    /// been in the heap.
+    ///
+    /// This method returns PRE_HEAP if \c item has never been in the
+    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
+    /// otherwise. In the latter case it is possible that \c item will
+    /// get back to the heap again.
+    State state(const Item &item) const {
+      int i=iimap[item];
+      if( i>=0 ) {
+        if ( container[i].in ) i=0;
+        else i=-2;
+      }
+      return State(i);
+    }
+
+    /// \brief Sets the state of the \c item in the heap.
+    ///
+    /// Sets the state of the \c item in the heap. It can be used to
+    /// manually clear the heap when it is important to achive the
+    /// better time complexity.
+    /// \param i The item.
+    /// \param st The state. It should not be \c IN_HEAP.
+    void state(const Item& i, State st) {
+      switch (st) {
+      case POST_HEAP:
+      case PRE_HEAP:
+        if (state(i) == IN_HEAP) {
+          erase(i);
+        }
+        iimap[i] = st;
+        break;
+      case IN_HEAP:
+        break;
+      }
+    }
+
+  private:
+    int find_min() {
+      int min_loc=-1, min_val;
+      int x=head;
+      if( x!=-1 ) {
+        min_val=container[x].prio;
+        min_loc=x;
+        x=container[x].right_neighbor;
+
+        while( x!=-1 ) {
+          if( comp( container[x].prio,min_val ) ) {
+            min_val=container[x].prio;
+            min_loc=x;
+          }
+          x=container[x].right_neighbor;
+        }
+      }
+      return min_loc;
+    }
+
+    void merge(int a) {
+      interleave(a);
+
+      int x=head;
+      if( -1!=x ) {
+        int x_prev=-1, x_next=container[x].right_neighbor;
+        while( -1!=x_next ) {
+          if( container[x].degree!=container[x_next].degree || ( -1!=container[x_next].right_neighbor && container[container[x_next].right_neighbor].degree==container[x].degree ) ) {
+            x_prev=x;
+            x=x_next;
+          }
+          else {
+            if( comp(container[x].prio,container[x_next].prio) ) {
+              container[x].right_neighbor=container[x_next].right_neighbor;
+              fuse(x_next,x);
+            }
+            else {
+              if( -1==x_prev ) { head=x_next; }
+              else {
+                container[x_prev].right_neighbor=x_next;
+              }
+              fuse(x,x_next);
+              x=x_next;
+            }
+          }
+          x_next=container[x].right_neighbor;
+        }
+      }
+    }
+
+    void interleave(int a) {
+      int other=-1, head_other=-1;
+
+      while( -1!=a || -1!=head ) {
+        if( -1==a ) {
+          if( -1==head_other ) {
+            head_other=head;
+          }
+          else {
+            container[other].right_neighbor=head;
+          }
+          head=-1;
+        }
+        else if( -1==head ) {
+          if( -1==head_other ) {
+            head_other=a;
+          }
+          else {
+            container[other].right_neighbor=a;
+          }
+          a=-1;
+        }
+        else {
+          if( container[a].degree<container[head].degree ) {
+            if( -1==head_other ) {
+              head_other=a;
+            }
+            else {
+              container[other].right_neighbor=a;
+            }
+            other=a;
+            a=container[a].right_neighbor;
+          }
+          else {
+            if( -1==head_other ) {
+              head_other=head;
+            }
+            else {
+              container[other].right_neighbor=head;
+            }
+            other=head;
+            head=container[head].right_neighbor;
+          }
+        }
+      }
+      head=head_other;
+    }
+
+    // Lacing a under b
+    void fuse(int a, int b) {
+      container[a].parent=b;
+      container[a].right_neighbor=container[b].child;
+      container[b].child=a;
+
+      ++container[b].degree;
+    }
+
+    // It is invoked only if a has siblings.
+    void unlace(int a) {
+      int neighb=container[a].right_neighbor;
+      int other=head;
+
+      while( container[other].right_neighbor!=a )
+        other=container[other].right_neighbor;
+      container[other].right_neighbor=neighb;
+    }
+
+  private:
+
+    class store {
+      friend class BinomHeap;
+
+      Item name;
+      int parent;
+      int right_neighbor;
+      int child;
+      int degree;
+      bool in;
+      Prio prio;
+
+      store() : parent(-1), right_neighbor(-1), child(-1), degree(0), in(true) {}
+    };
+  };
+
+} //namespace lemon
+
+#endif //LEMON_BINOM_HEAP_H
+
Index: lemon/bits/edge_set_extender.h
===================================================================
--- lemon/bits/edge_set_extender.h	(revision 685)
+++ lemon/bits/edge_set_extender.h	(revision 617)
@@ -538,5 +538,5 @@
 
     public:
-      explicit ArcMap(const Graph& _g) 
+      ArcMap(const Graph& _g) 
 	: Parent(_g) {}
       ArcMap(const Graph& _g, const _Value& _v) 
@@ -562,5 +562,5 @@
 
     public:
-      explicit EdgeMap(const Graph& _g) 
+      EdgeMap(const Graph& _g) 
 	: Parent(_g) {}
 
Index: lemon/bits/graph_extender.h
===================================================================
--- lemon/bits/graph_extender.h	(revision 685)
+++ lemon/bits/graph_extender.h	(revision 617)
@@ -605,5 +605,5 @@
 
     public:
-      explicit NodeMap(const Graph& graph)
+      NodeMap(const Graph& graph)
         : Parent(graph) {}
       NodeMap(const Graph& graph, const _Value& value)
@@ -629,5 +629,5 @@
 
     public:
-      explicit ArcMap(const Graph& graph)
+      ArcMap(const Graph& graph)
         : Parent(graph) {}
       ArcMap(const Graph& graph, const _Value& value)
@@ -653,5 +653,5 @@
 
     public:
-      explicit EdgeMap(const Graph& graph)
+      EdgeMap(const Graph& graph)
         : Parent(graph) {}
 
Index: lemon/circulation.h
===================================================================
--- lemon/circulation.h	(revision 689)
+++ lemon/circulation.h	(revision 641)
@@ -451,9 +451,8 @@
     }
 
-    /// \brief Sets the tolerance used by the algorithm.
-    ///
-    /// Sets the tolerance object used by the algorithm.
-    /// \return <tt>(*this)</tt>
-    Circulation& tolerance(const Tolerance& tolerance) {
+    /// \brief Sets the tolerance used by algorithm.
+    ///
+    /// Sets the tolerance used by algorithm.
+    Circulation& tolerance(const Tolerance& tolerance) const {
       _tol = tolerance;
       return *this;
@@ -462,8 +461,7 @@
     /// \brief Returns a const reference to the tolerance.
     ///
-    /// Returns a const reference to the tolerance object used by
-    /// the algorithm.
+    /// Returns a const reference to the tolerance.
     const Tolerance& tolerance() const {
-      return _tol;
+      return tolerance;
     }
 
Index: lemon/fourary_heap.h
===================================================================
--- lemon/fourary_heap.h	(revision 701)
+++ lemon/fourary_heap.h	(revision 701)
@@ -0,0 +1,350 @@
+/* -*- C++ -*-
+ *
+ * This file is a part of LEMON, a generic C++ optimization library
+ *
+ * Copyright (C) 2003-2008
+ * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Research Group on Combinatorial Optimization, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+#ifndef LEMON_FOURARY_HEAP_H
+#define LEMON_FOURARY_HEAP_H
+
+///\ingroup auxdat
+///\file
+///\brief 4ary Heap implementation.
+
+#include <iostream>
+#include <vector>
+#include <utility>
+#include <functional>
+
+namespace lemon {
+
+  ///\ingroup auxdat
+  ///
+  ///\brief A 4ary Heap implementation.
+  ///
+  ///This class implements the \e 4ary \e heap data structure. A \e heap
+  ///is a data structure for storing items with specified values called \e
+  ///priorities in such a way that finding the item with minimum priority is
+  ///efficient. \c Compare specifies the ordering of the priorities. In a heap
+  ///one can change the priority of an item, add or erase an item, etc.
+  ///
+  ///\param _Prio Type of the priority of the items.
+  ///\param _ItemIntMap A read and writable Item int map, used internally
+  ///to handle the cross references.
+  ///\param _Compare A class for the ordering of the priorities. The
+  ///default is \c std::less<_Prio>.
+  ///
+  ///\sa FibHeap
+  ///\sa Dijkstra
+  ///\author Dorian Batha
+
+  template <typename _Prio, typename _ItemIntMap,
+            typename _Compare = std::less<_Prio> >
+
+  class FouraryHeap {
+
+  public:
+    ///\e
+    typedef _ItemIntMap ItemIntMap;
+    ///\e
+    typedef _Prio Prio;
+    ///\e
+    typedef typename ItemIntMap::Key Item;
+    ///\e
+    typedef std::pair<Item,Prio> Pair;
+    ///\e
+    typedef _Compare Compare;
+
+    /// \brief Type to represent the items states.
+    ///
+    /// Each Item element have a state associated to it. It may be "in heap",
+    /// "pre heap" or "post heap". The latter two are indifferent from the
+    /// heap's point of view, but may be useful to the user.
+    ///
+    /// The ItemIntMap \e should be initialized in such way that it maps
+    /// PRE_HEAP (-1) to any element to be put in the heap...
+    enum State {
+      IN_HEAP = 0,
+      PRE_HEAP = -1,
+      POST_HEAP = -2
+    };
+
+  private:
+    std::vector<Pair> data;
+    Compare comp;
+    ItemIntMap &iim;
+
+  public:
+    /// \brief The constructor.
+    ///
+    /// The constructor.
+    /// \param _iim should be given to the constructor, since it is used
+    /// internally to handle the cross references. The value of the map
+    /// should be PRE_HEAP (-1) for each element.
+    explicit FouraryHeap(ItemIntMap &_iim) : iim(_iim) {}
+
+    /// \brief The constructor.
+    ///
+    /// The constructor.
+    /// \param _iim should be given to the constructor, since it is used
+    /// internally to handle the cross references. The value of the map
+    /// should be PRE_HEAP (-1) for each element.
+    ///
+    /// \param _comp The comparator function object.
+    FouraryHeap(ItemIntMap &_iim, const Compare &_comp)
+      : iim(_iim), comp(_comp) {}
+
+    /// The number of items stored in the heap.
+    ///
+    /// \brief Returns the number of items stored in the heap.
+    int size() const { return data.size(); }
+
+    /// \brief Checks if the heap stores no items.
+    ///
+    /// Returns \c true if and only if the heap stores no items.
+    bool empty() const { return data.empty(); }
+
+    /// \brief Make empty this heap.
+    ///
+    /// Make empty this heap. It does not change the cross reference map.
+    /// If you want to reuse what is not surely empty you should first clear
+    /// the heap and after that you should set the cross reference map for
+    /// each item to \c PRE_HEAP.
+    void clear() { data.clear(); }
+
+  private:
+    static int parent(int i) { return (i-1)/4; }
+    static int firstChild(int i) { return 4*i+1; }
+
+    bool less(const Pair &p1, const Pair &p2) const {
+      return comp(p1.second, p2.second);
+    }
+
+    int find_min(const int child, const int length) {
+      int min=child;
+      if( child+3<length ) {
+        if( less(data[child+3], data[min]) )
+          min=child+3;
+        if( less(data[child+2], data[min]) )
+          min=child+2;
+        if( less(data[child+1], data[min]) )
+          min=child+1;
+      }
+      else if( child+2<length ) {
+        if( less(data[child+2], data[min]) )
+          min=child+2;
+        if( less(data[child+1], data[min]) )
+          min=child+1;
+      }
+      else if( child+1<length ) {
+        if( less(data[child+1], data[min]) )
+          min=child+1;
+      }
+      return min;
+    }
+
+    void bubble_up(int hole, Pair p) {
+      int par = parent(hole);
+      while( hole>0 && less(p,data[par]) ) {
+        move(data[par],hole);
+        hole = par;
+        par = parent(hole);
+      }
+      move(p, hole);
+    }
+
+    void bubble_down(int hole, Pair p, int length) {
+      int child = firstChild(hole);
+      while( child<length && length>1 ) {
+        child = find_min(child,length);
+        if( !less(data[child], p) )
+          goto ok;
+        move(data[child], hole);
+        hole = child;
+        child = firstChild(hole);
+      }
+    ok:
+      move(p, hole);
+    }
+
+    void move(const Pair &p, int i) {
+      data[i] = p;
+      iim.set(p.first, i);
+    }
+
+  public:
+
+    /// \brief Insert a pair of item and priority into the heap.
+    ///
+    /// Adds \c p.first to the heap with priority \c p.second.
+    /// \param p The pair to insert.
+    void push(const Pair &p) {
+      int n = data.size();
+      data.resize(n+1);
+      bubble_up(n, p);
+    }
+
+    /// \brief Insert an item into the heap with the given heap.
+    ///
+    /// Adds \c i to the heap with priority \c p.
+    /// \param i The item to insert.
+    /// \param p The priority of the item.
+    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
+
+    /// \brief Returns the item with minimum priority relative to \c Compare.
+    ///
+    /// This method returns the item with minimum priority relative to \c
+    /// Compare.
+    /// \pre The heap must be nonempty.
+    Item top() const { return data[0].first; }
+
+    /// \brief Returns the minimum priority relative to \c Compare.
+    ///
+    /// It returns the minimum priority relative to \c Compare.
+    /// \pre The heap must be nonempty.
+    Prio prio() const { return data[0].second; }
+
+    /// \brief Deletes the item with minimum priority relative to \c Compare.
+    ///
+    /// This method deletes the item with minimum priority relative to \c
+    /// Compare from the heap.
+    /// \pre The heap must be non-empty.
+    void pop() {
+      int n = data.size()-1;
+      iim.set(data[0].first, POST_HEAP);
+      if (n>0) bubble_down(0, data[n], n);
+      data.pop_back();
+    }
+
+    /// \brief Deletes \c i from the heap.
+    ///
+    /// This method deletes item \c i from the heap.
+    /// \param i The item to erase.
+    /// \pre The item should be in the heap.
+    void erase(const Item &i) {
+      int h = iim[i];
+      int n = data.size()-1;
+      iim.set(data[h].first, POST_HEAP);
+      if( h<n ) {
+        if( less(data[parent(h)], data[n]) )
+          bubble_down(h, data[n], n);
+        else
+          bubble_up(h, data[n]);
+      }
+      data.pop_back();
+    }
+
+    /// \brief Returns the priority of \c i.
+    ///
+    /// This function returns the priority of item \c i.
+    /// \pre \c i must be in the heap.
+    /// \param i The item.
+    Prio operator[](const Item &i) const {
+      int idx = iim[i];
+      return data[idx].second;
+    }
+
+    /// \brief \c i gets to the heap with priority \c p independently
+    /// if \c i was already there.
+    ///
+    /// This method calls \ref push(\c i, \c p) if \c i is not stored
+    /// in the heap and sets the priority of \c i to \c p otherwise.
+    /// \param i The item.
+    /// \param p The priority.
+    void set(const Item &i, const Prio &p) {
+      int idx = iim[i];
+      if( idx < 0 )
+        push(i,p);
+      else if( comp(p, data[idx].second) )
+        bubble_up(idx, Pair(i,p));
+      else
+        bubble_down(idx, Pair(i,p), data.size());
+    }
+
+    /// \brief Decreases the priority of \c i to \c p.
+    ///
+    /// This method decreases the priority of item \c i to \c p.
+    /// \pre \c i must be stored in the heap with priority at least \c
+    /// p relative to \c Compare.
+    /// \param i The item.
+    /// \param p The priority.
+    void decrease(const Item &i, const Prio &p) {
+      int idx = iim[i];
+      bubble_up(idx, Pair(i,p));
+    }
+
+    /// \brief Increases the priority of \c i to \c p.
+    ///
+    /// This method sets the priority of item \c i to \c p.
+    /// \pre \c i must be stored in the heap with priority at most \c
+    /// p relative to \c Compare.
+    /// \param i The item.
+    /// \param p The priority.
+    void increase(const Item &i, const Prio &p) {
+      int idx = iim[i];
+      bubble_down(idx, Pair(i,p), data.size());
+    }
+
+    /// \brief Returns if \c item is in, has already been in, or has
+    /// never been in the heap.
+    ///
+    /// This method returns PRE_HEAP if \c item has never been in the
+    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
+    /// otherwise. In the latter case it is possible that \c item will
+    /// get back to the heap again.
+    /// \param i The item.
+    State state(const Item &i) const {
+      int s = iim[i];
+      if (s>=0) s=0;
+      return State(s);
+    }
+
+    /// \brief Sets the state of the \c item in the heap.
+    ///
+    /// Sets the state of the \c item in the heap. It can be used to
+    /// manually clear the heap when it is important to achive the
+    /// better time complexity.
+    /// \param i The item.
+    /// \param st The state. It should not be \c IN_HEAP.
+    void state(const Item& i, State st) {
+      switch (st) {
+        case POST_HEAP:
+        case PRE_HEAP:
+          if (state(i) == IN_HEAP) erase(i);
+          iim[i] = st;
+          break;
+        case IN_HEAP:
+          break;
+      }
+    }
+
+    /// \brief Replaces an item in the heap.
+    ///
+    /// The \c i item is replaced with \c j item. The \c i item should
+    /// be in the heap, while the \c j should be out of the heap. The
+    /// \c i item will out of the heap and \c j will be in the heap
+    /// with the same prioriority as prevoiusly the \c i item.
+    void replace(const Item& i, const Item& j) {
+      int idx = iim[i];
+      iim.set(i, iim[j]);
+      iim.set(j, idx);
+      data[idx].first = j;
+    }
+
+  }; // class FouraryHeap
+
+} // namespace lemon
+
+#endif // LEMON_FOURARY_HEAP_H
Index: lemon/kary_heap.h
===================================================================
--- lemon/kary_heap.h	(revision 701)
+++ lemon/kary_heap.h	(revision 701)
@@ -0,0 +1,342 @@
+/* -*- C++ -*-
+ *
+ * This file is a part of LEMON, a generic C++ optimization library
+ *
+ * Copyright (C) 2003-2008
+ * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Research Group on Combinatorial Optimization, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+#ifndef LEMON_KARY_HEAP_H
+#define LEMON_KARY_HEAP_H
+
+///\ingroup auxdat
+///\file
+///\brief Kary Heap implementation.
+
+#include <iostream>
+#include <vector>
+#include <utility>
+#include <functional>
+
+namespace lemon {
+
+  ///\ingroup auxdat
+  ///
+  ///\brief A Kary Heap implementation.
+  ///
+  ///This class implements the \e Kary \e heap data structure. A \e heap
+  ///is a data structure for storing items with specified values called \e
+  ///priorities in such a way that finding the item with minimum priority is
+  ///efficient. \c Compare specifies the ordering of the priorities. In a heap
+  ///one can change the priority of an item, add or erase an item, etc.
+  ///
+  ///\param _Prio Type of the priority of the items.
+  ///\param _ItemIntMap A read and writable Item int map, used internally
+  ///to handle the cross references.
+  ///\param _Compare A class for the ordering of the priorities. The
+  ///default is \c std::less<_Prio>.
+  ///
+  ///\sa FibHeap
+  ///\sa Dijkstra
+  ///\author Dorian Batha
+
+  template <typename _Prio, typename _ItemIntMap,
+            typename _Compare = std::less<_Prio> >
+
+  class KaryHeap {
+
+  public:
+    ///\e
+    typedef _ItemIntMap ItemIntMap;
+    ///\e
+    typedef _Prio Prio;
+    ///\e
+    typedef typename ItemIntMap::Key Item;
+    ///\e
+    typedef std::pair<Item,Prio> Pair;
+    ///\e
+    typedef _Compare Compare;
+    ///\e
+
+    /// \brief Type to represent the items states.
+    ///
+    /// Each Item element have a state associated to it. It may be "in heap",
+    /// "pre heap" or "post heap". The latter two are indifferent from the
+    /// heap's point of view, but may be useful to the user.
+    ///
+    /// The ItemIntMap \e should be initialized in such way that it maps
+    /// PRE_HEAP (-1) to any element to be put in the heap...
+    enum State {
+      IN_HEAP = 0,
+      PRE_HEAP = -1,
+      POST_HEAP = -2
+    };
+
+  private:
+    std::vector<Pair> data;
+    Compare comp;
+    ItemIntMap &iim;
+    int K;
+
+  public:
+    /// \brief The constructor.
+    ///
+    /// The constructor.
+    /// \param _iim should be given to the constructor, since it is used
+    /// internally to handle the cross references. The value of the map
+    /// should be PRE_HEAP (-1) for each element.
+    explicit KaryHeap(ItemIntMap &_iim, const int &_K=32) : iim(_iim), K(_K) {}
+
+    /// \brief The constructor.
+    ///
+    /// The constructor.
+    /// \param _iim should be given to the constructor, since it is used
+    /// internally to handle the cross references. The value of the map
+    /// should be PRE_HEAP (-1) for each element.
+    ///
+    /// \param _comp The comparator function object.
+    KaryHeap(ItemIntMap &_iim, const Compare &_comp, const int &_K=32)
+      : iim(_iim), comp(_comp), K(_K) {}
+
+
+    /// The number of items stored in the heap.
+    ///
+    /// \brief Returns the number of items stored in the heap.
+    int size() const { return data.size(); }
+
+    /// \brief Checks if the heap stores no items.
+    ///
+    /// Returns \c true if and only if the heap stores no items.
+    bool empty() const { return data.empty(); }
+
+    /// \brief Make empty this heap.
+    ///
+    /// Make empty this heap. It does not change the cross reference map.
+    /// If you want to reuse what is not surely empty you should first clear
+    /// the heap and after that you should set the cross reference map for
+    /// each item to \c PRE_HEAP.
+    void clear() { data.clear(); }
+
+  private:
+    int parent(int i) { return (i-1)/K; }
+    int first_child(int i) { return K*i+1; }
+
+    bool less(const Pair &p1, const Pair &p2) const {
+      return comp(p1.second, p2.second);
+    }
+
+    int find_min(const int child, const int length) {
+      int min=child, i=1;
+      while( i<K && child+i<length ) {
+        if( less(data[child+i], data[min]) )
+          min=child+i;
+        ++i;
+      }
+      return min;
+    }
+
+    void bubble_up(int hole, Pair p) {
+      int par = parent(hole);
+      while( hole>0 && less(p,data[par]) ) {
+        move(data[par],hole);
+        hole = par;
+        par = parent(hole);
+      }
+      move(p, hole);
+    }
+
+    void bubble_down(int hole, Pair p, int length) {
+      if( length>1 ) {
+        int child = first_child(hole);
+        while( child<length ) {
+          child = find_min(child, length);
+          if( !less(data[child], p) )
+            goto ok;
+          move(data[child], hole);
+          hole = child;
+          child = first_child(hole);
+        }
+      }
+    ok:
+      move(p, hole);
+    }
+
+    void move(const Pair &p, int i) {
+      data[i] = p;
+      iim.set(p.first, i);
+    }
+
+  public:
+    /// \brief Insert a pair of item and priority into the heap.
+    ///
+    /// Adds \c p.first to the heap with priority \c p.second.
+    /// \param p The pair to insert.
+    void push(const Pair &p) {
+      int n = data.size();
+      data.resize(n+1);
+      bubble_up(n, p);
+    }
+
+    /// \brief Insert an item into the heap with the given heap.
+    ///
+    /// Adds \c i to the heap with priority \c p.
+    /// \param i The item to insert.
+    /// \param p The priority of the item.
+    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
+
+    /// \brief Returns the item with minimum priority relative to \c Compare.
+    ///
+    /// This method returns the item with minimum priority relative to \c
+    /// Compare.
+    /// \pre The heap must be nonempty.
+    Item top() const { return data[0].first; }
+
+    /// \brief Returns the minimum priority relative to \c Compare.
+    ///
+    /// It returns the minimum priority relative to \c Compare.
+    /// \pre The heap must be nonempty.
+    Prio prio() const { return data[0].second; }
+
+    /// \brief Deletes the item with minimum priority relative to \c Compare.
+    ///
+    /// This method deletes the item with minimum priority relative to \c
+    /// Compare from the heap.
+    /// \pre The heap must be non-empty.
+    void pop() {
+      int n = data.size()-1;
+      iim.set(data[0].first, POST_HEAP);
+      if (n>0) bubble_down(0, data[n], n);
+      data.pop_back();
+    }
+
+    /// \brief Deletes \c i from the heap.
+    ///
+    /// This method deletes item \c i from the heap.
+    /// \param i The item to erase.
+    /// \pre The item should be in the heap.
+    void erase(const Item &i) {
+      int h = iim[i];
+      int n = data.size()-1;
+      iim.set(data[h].first, POST_HEAP);
+      if( h<n ) {
+        if( less(data[parent(h)], data[n]) )
+          bubble_down(h, data[n], n);
+        else
+          bubble_up(h, data[n]);
+      }
+      data.pop_back();
+    }
+
+
+    /// \brief Returns the priority of \c i.
+    ///
+    /// This function returns the priority of item \c i.
+    /// \pre \c i must be in the heap.
+    /// \param i The item.
+    Prio operator[](const Item &i) const {
+      int idx = iim[i];
+      return data[idx].second;
+    }
+
+    /// \brief \c i gets to the heap with priority \c p independently
+    /// if \c i was already there.
+    ///
+    /// This method calls \ref push(\c i, \c p) if \c i is not stored
+    /// in the heap and sets the priority of \c i to \c p otherwise.
+    /// \param i The item.
+    /// \param p The priority.
+    void set(const Item &i, const Prio &p) {
+      int idx = iim[i];
+      if( idx<0 )
+        push(i,p);
+      else if( comp(p, data[idx].second) )
+        bubble_up(idx, Pair(i,p));
+      else
+        bubble_down(idx, Pair(i,p), data.size());
+    }
+
+    /// \brief Decreases the priority of \c i to \c p.
+    ///
+    /// This method decreases the priority of item \c i to \c p.
+    /// \pre \c i must be stored in the heap with priority at least \c
+    /// p relative to \c Compare.
+    /// \param i The item.
+    /// \param p The priority.
+    void decrease(const Item &i, const Prio &p) {
+      int idx = iim[i];
+      bubble_up(idx, Pair(i,p));
+    }
+
+    /// \brief Increases the priority of \c i to \c p.
+    ///
+    /// This method sets the priority of item \c i to \c p.
+    /// \pre \c i must be stored in the heap with priority at most \c
+    /// p relative to \c Compare.
+    /// \param i The item.
+    /// \param p The priority.
+    void increase(const Item &i, const Prio &p) {
+      int idx = iim[i];
+      bubble_down(idx, Pair(i,p), data.size());
+    }
+
+    /// \brief Returns if \c item is in, has already been in, or has
+    /// never been in the heap.
+    ///
+    /// This method returns PRE_HEAP if \c item has never been in the
+    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
+    /// otherwise. In the latter case it is possible that \c item will
+    /// get back to the heap again.
+    /// \param i The item.
+    State state(const Item &i) const {
+      int s = iim[i];
+      if (s>=0) s=0;
+      return State(s);
+    }
+
+    /// \brief Sets the state of the \c item in the heap.
+    ///
+    /// Sets the state of the \c item in the heap. It can be used to
+    /// manually clear the heap when it is important to achive the
+    /// better time complexity.
+    /// \param i The item.
+    /// \param st The state. It should not be \c IN_HEAP.
+    void state(const Item& i, State st) {
+      switch (st) {
+      case POST_HEAP:
+      case PRE_HEAP:
+        if (state(i) == IN_HEAP) erase(i);
+        iim[i] = st;
+        break;
+      case IN_HEAP:
+        break;
+      }
+    }
+
+    /// \brief Replaces an item in the heap.
+    ///
+    /// The \c i item is replaced with \c j item. The \c i item should
+    /// be in the heap, while the \c j should be out of the heap. The
+    /// \c i item will out of the heap and \c j will be in the heap
+    /// with the same prioriority as prevoiusly the \c i item.
+    void replace(const Item& i, const Item& j) {
+      int idx=iim[i];
+      iim.set(i, iim[j]);
+      iim.set(j, idx);
+      data[idx].first=j;
+    }
+
+  }; // class KaryHeap
+
+} // namespace lemon
+
+#endif // LEMON_KARY_HEAP_H
Index: lemon/maps.h
===================================================================
--- lemon/maps.h	(revision 695)
+++ lemon/maps.h	(revision 617)
@@ -23,5 +23,4 @@
 #include <functional>
 #include <vector>
-#include <map>
 
 #include <lemon/core.h>
@@ -30,4 +29,6 @@
 ///\ingroup maps
 ///\brief Miscellaneous property maps
+
+#include <map>
 
 namespace lemon {
@@ -1818,5 +1819,5 @@
   ///
   /// IdMap provides a unique and immutable id for each item of the
-  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
+  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
   ///  - \b unique: different items get different ids,
   ///  - \b immutable: the id of an item does not change (even if you
@@ -1902,11 +1903,10 @@
 
   /// This class provides simple invertable graph maps.
-  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
-  /// and if a key is set to a new value, then stores it in the inverse map.
+  /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
+  /// and if a key is set to a new value then store it
+  /// in the inverse map.
+  ///
   /// The values of the map can be accessed
   /// with stl compatible forward iterator.
-  ///
-  /// This type is not reference map, so it cannot be modified with
-  /// the subscript operator.
   ///
   /// \tparam GR The graph type.
@@ -1924,5 +1924,5 @@
       template Map<V>::Type Map;
 
-    typedef std::multimap<V, K> Container;
+    typedef std::map<V, K> Container;
     Container _inv_map;
 
@@ -1949,6 +1949,4 @@
     /// iterator on the values of the map. The values can
     /// be accessed in the <tt>[beginValue, endValue)</tt> range.
-    /// They are considered with multiplicity, so each value is
-    /// traversed for each item it is assigned to.
     class ValueIterator
       : public std::iterator<std::forward_iterator_tag, Value> {
@@ -2003,13 +2001,9 @@
     void set(const Key& key, const Value& val) {
       Value oldval = Map::operator[](key);
-      typename Container::iterator it;
-      for (it = _inv_map.equal_range(oldval).first;
-           it != _inv_map.equal_range(oldval).second; ++it) {
-        if (it->second == key) {
-          _inv_map.erase(it);
-          break;
-        }
+      typename Container::iterator it = _inv_map.find(oldval);
+      if (it != _inv_map.end() && it->second == key) {
+        _inv_map.erase(it);
       }
-      _inv_map.insert(std::make_pair(val, key));
+      _inv_map.insert(make_pair(val, key));
       Map::set(key, val);
     }
@@ -2023,12 +2017,9 @@
     }
 
-    /// \brief Gives back an item by its value.
-    ///
-    /// This function gives back an item that is assigned to
-    /// the given value or \c INVALID if no such item exists.
-    /// If there are more items with the same associated value,
-    /// only one of them is returned.
-    Key operator()(const Value& val) const {
-      typename Container::const_iterator it = _inv_map.find(val);
+    /// \brief Gives back the item by its value.
+    ///
+    /// Gives back the item by its value.
+    Key operator()(const Value& key) const {
+      typename Container::const_iterator it = _inv_map.find(key);
       return it != _inv_map.end() ? it->second : INVALID;
     }
@@ -2042,11 +2033,7 @@
     virtual void erase(const Key& key) {
       Value val = Map::operator[](key);
-      typename Container::iterator it;
-      for (it = _inv_map.equal_range(val).first;
-           it != _inv_map.equal_range(val).second; ++it) {
-        if (it->second == key) {
-          _inv_map.erase(it);
-          break;
-        }
+      typename Container::iterator it = _inv_map.find(val);
+      if (it != _inv_map.end() && it->second == key) {
+        _inv_map.erase(it);
       }
       Map::erase(key);
@@ -2060,11 +2047,7 @@
       for (int i = 0; i < int(keys.size()); ++i) {
         Value val = Map::operator[](keys[i]);
-        typename Container::iterator it;
-        for (it = _inv_map.equal_range(val).first;
-             it != _inv_map.equal_range(val).second; ++it) {
-          if (it->second == keys[i]) {
-            _inv_map.erase(it);
-            break;
-          }
+        typename Container::iterator it = _inv_map.find(val);
+        if (it != _inv_map.end() && it->second == keys[i]) {
+          _inv_map.erase(it);
         }
       }
@@ -2102,7 +2085,6 @@
       /// \brief Subscript operator.
       ///
-      /// Subscript operator. It gives back an item
-      /// that is assigned to the given value or \c INVALID
-      /// if no such item exists.
+      /// Subscript operator. It gives back the item
+      /// that was last assigned to the given value.
       Value operator[](const Key& key) const {
         return _inverted(key);
@@ -2273,5 +2255,5 @@
 
     /// \brief Gives back the item belonging to a \e RangeId
-    ///
+    /// 
     /// Gives back the item belonging to a \e RangeId.
     Item operator()(int id) const {
@@ -2330,901 +2312,4 @@
   };
 
-  /// \brief Dynamic iterable \c bool map.
-  ///
-  /// This class provides a special graph map type which can store a
-  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
-  /// For both \c true and \c false values it is possible to iterate on
-  /// the keys.
-  ///
-  /// This type is a reference map, so it can be modified with the
-  /// subscript operator.
-  ///
-  /// \tparam GR The graph type.
-  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
-  /// \c GR::Edge).
-  ///
-  /// \see IterableIntMap, IterableValueMap
-  /// \see CrossRefMap
-  template <typename GR, typename K>
-  class IterableBoolMap
-    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
-  private:
-    typedef GR Graph;
-
-    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
-    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
-
-    std::vector<K> _array;
-    int _sep;
-
-  public:
-
-    /// Indicates that the map is reference map.
-    typedef True ReferenceMapTag;
-
-    /// The key type
-    typedef K Key;
-    /// The value type
-    typedef bool Value;
-    /// The const reference type.
-    typedef const Value& ConstReference;
-
-  private:
-
-    int position(const Key& key) const {
-      return Parent::operator[](key);
-    }
-
-  public:
-
-    /// \brief Reference to the value of the map.
-    ///
-    /// This class is similar to the \c bool type. It can be converted to
-    /// \c bool and it provides the same operators.
-    class Reference {
-      friend class IterableBoolMap;
-    private:
-      Reference(IterableBoolMap& map, const Key& key)
-        : _key(key), _map(map) {}
-    public:
-
-      Reference& operator=(const Reference& value) {
-        _map.set(_key, static_cast<bool>(value));
-         return *this;
-      }
-
-      operator bool() const {
-        return static_cast<const IterableBoolMap&>(_map)[_key];
-      }
-
-      Reference& operator=(bool value) {
-        _map.set(_key, value);
-        return *this;
-      }
-      Reference& operator&=(bool value) {
-        _map.set(_key, _map[_key] & value);
-        return *this;
-      }
-      Reference& operator|=(bool value) {
-        _map.set(_key, _map[_key] | value);
-        return *this;
-      }
-      Reference& operator^=(bool value) {
-        _map.set(_key, _map[_key] ^ value);
-        return *this;
-      }
-    private:
-      Key _key;
-      IterableBoolMap& _map;
-    };
-
-    /// \brief Constructor of the map with a default value.
-    ///
-    /// Constructor of the map with a default value.
-    explicit IterableBoolMap(const Graph& graph, bool def = false)
-      : Parent(graph) {
-      typename Parent::Notifier* nf = Parent::notifier();
-      Key it;
-      for (nf->first(it); it != INVALID; nf->next(it)) {
-        Parent::set(it, _array.size());
-        _array.push_back(it);
-      }
-      _sep = (def ? _array.size() : 0);
-    }
-
-    /// \brief Const subscript operator of the map.
-    ///
-    /// Const subscript operator of the map.
-    bool operator[](const Key& key) const {
-      return position(key) < _sep;
-    }
-
-    /// \brief Subscript operator of the map.
-    ///
-    /// Subscript operator of the map.
-    Reference operator[](const Key& key) {
-      return Reference(*this, key);
-    }
-
-    /// \brief Set operation of the map.
-    ///
-    /// Set operation of the map.
-    void set(const Key& key, bool value) {
-      int pos = position(key);
-      if (value) {
-        if (pos < _sep) return;
-        Key tmp = _array[_sep];
-        _array[_sep] = key;
-        Parent::set(key, _sep);
-        _array[pos] = tmp;
-        Parent::set(tmp, pos);
-        ++_sep;
-      } else {
-        if (pos >= _sep) return;
-        --_sep;
-        Key tmp = _array[_sep];
-        _array[_sep] = key;
-        Parent::set(key, _sep);
-        _array[pos] = tmp;
-        Parent::set(tmp, pos);
-      }
-    }
-
-    /// \brief Set all items.
-    ///
-    /// Set all items in the map.
-    /// \note Constant time operation.
-    void setAll(bool value) {
-      _sep = (value ? _array.size() : 0);
-    }
-
-    /// \brief Returns the number of the keys mapped to \c true.
-    ///
-    /// Returns the number of the keys mapped to \c true.
-    int trueNum() const {
-      return _sep;
-    }
-
-    /// \brief Returns the number of the keys mapped to \c false.
-    ///
-    /// Returns the number of the keys mapped to \c false.
-    int falseNum() const {
-      return _array.size() - _sep;
-    }
-
-    /// \brief Iterator for the keys mapped to \c true.
-    ///
-    /// Iterator for the keys mapped to \c true. It works
-    /// like a graph item iterator, it can be converted to
-    /// the key type of the map, incremented with \c ++ operator, and
-    /// if the iterator leaves the last valid key, it will be equal to
-    /// \c INVALID.
-    class TrueIt : public Key {
-    public:
-      typedef Key Parent;
-
-      /// \brief Creates an iterator.
-      ///
-      /// Creates an iterator. It iterates on the
-      /// keys mapped to \c true.
-      /// \param map The IterableBoolMap.
-      explicit TrueIt(const IterableBoolMap& map)
-        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
-          _map(&map) {}
-
-      /// \brief Invalid constructor \& conversion.
-      ///
-      /// This constructor initializes the iterator to be invalid.
-      /// \sa Invalid for more details.
-      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
-
-      /// \brief Increment operator.
-      ///
-      /// Increment operator.
-      TrueIt& operator++() {
-        int pos = _map->position(*this);
-        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
-        return *this;
-      }
-
-    private:
-      const IterableBoolMap* _map;
-    };
-
-    /// \brief Iterator for the keys mapped to \c false.
-    ///
-    /// Iterator for the keys mapped to \c false. It works
-    /// like a graph item iterator, it can be converted to
-    /// the key type of the map, incremented with \c ++ operator, and
-    /// if the iterator leaves the last valid key, it will be equal to
-    /// \c INVALID.
-    class FalseIt : public Key {
-    public:
-      typedef Key Parent;
-
-      /// \brief Creates an iterator.
-      ///
-      /// Creates an iterator. It iterates on the
-      /// keys mapped to \c false.
-      /// \param map The IterableBoolMap.
-      explicit FalseIt(const IterableBoolMap& map)
-        : Parent(map._sep < int(map._array.size()) ?
-                 map._array.back() : INVALID), _map(&map) {}
-
-      /// \brief Invalid constructor \& conversion.
-      ///
-      /// This constructor initializes the iterator to be invalid.
-      /// \sa Invalid for more details.
-      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
-
-      /// \brief Increment operator.
-      ///
-      /// Increment operator.
-      FalseIt& operator++() {
-        int pos = _map->position(*this);
-        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
-        return *this;
-      }
-
-    private:
-      const IterableBoolMap* _map;
-    };
-
-    /// \brief Iterator for the keys mapped to a given value.
-    ///
-    /// Iterator for the keys mapped to a given value. It works
-    /// like a graph item iterator, it can be converted to
-    /// the key type of the map, incremented with \c ++ operator, and
-    /// if the iterator leaves the last valid key, it will be equal to
-    /// \c INVALID.
-    class ItemIt : public Key {
-    public:
-      typedef Key Parent;
-
-      /// \brief Creates an iterator with a value.
-      ///
-      /// Creates an iterator with a value. It iterates on the
-      /// keys mapped to the given value.
-      /// \param map The IterableBoolMap.
-      /// \param value The value.
-      ItemIt(const IterableBoolMap& map, bool value)
-        : Parent(value ? 
-                 (map._sep > 0 ?
-                  map._array[map._sep - 1] : INVALID) :
-                 (map._sep < int(map._array.size()) ?
-                  map._array.back() : INVALID)), _map(&map) {}
-
-      /// \brief Invalid constructor \& conversion.
-      ///
-      /// This constructor initializes the iterator to be invalid.
-      /// \sa Invalid for more details.
-      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
-
-      /// \brief Increment operator.
-      ///
-      /// Increment operator.
-      ItemIt& operator++() {
-        int pos = _map->position(*this);
-        int _sep = pos >= _map->_sep ? _map->_sep : 0;
-        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
-        return *this;
-      }
-
-    private:
-      const IterableBoolMap* _map;
-    };
-
-  protected:
-
-    virtual void add(const Key& key) {
-      Parent::add(key);
-      Parent::set(key, _array.size());
-      _array.push_back(key);
-    }
-
-    virtual void add(const std::vector<Key>& keys) {
-      Parent::add(keys);
-      for (int i = 0; i < int(keys.size()); ++i) {
-        Parent::set(keys[i], _array.size());
-        _array.push_back(keys[i]);
-      }
-    }
-
-    virtual void erase(const Key& key) {
-      int pos = position(key);
-      if (pos < _sep) {
-        --_sep;
-        Parent::set(_array[_sep], pos);
-        _array[pos] = _array[_sep];
-        Parent::set(_array.back(), _sep);
-        _array[_sep] = _array.back();
-        _array.pop_back();
-      } else {
-        Parent::set(_array.back(), pos);
-        _array[pos] = _array.back();
-        _array.pop_back();
-      }
-      Parent::erase(key);
-    }
-
-    virtual void erase(const std::vector<Key>& keys) {
-      for (int i = 0; i < int(keys.size()); ++i) {
-        int pos = position(keys[i]);
-        if (pos < _sep) {
-          --_sep;
-          Parent::set(_array[_sep], pos);
-          _array[pos] = _array[_sep];
-          Parent::set(_array.back(), _sep);
-          _array[_sep] = _array.back();
-          _array.pop_back();
-        } else {
-          Parent::set(_array.back(), pos);
-          _array[pos] = _array.back();
-          _array.pop_back();
-        }
-      }
-      Parent::erase(keys);
-    }
-
-    virtual void build() {
-      Parent::build();
-      typename Parent::Notifier* nf = Parent::notifier();
-      Key it;
-      for (nf->first(it); it != INVALID; nf->next(it)) {
-        Parent::set(it, _array.size());
-        _array.push_back(it);
-      }
-      _sep = 0;
-    }
-
-    virtual void clear() {
-      _array.clear();
-      _sep = 0;
-      Parent::clear();
-    }
-
-  };
-
-
-  namespace _maps_bits {
-    template <typename Item>
-    struct IterableIntMapNode {
-      IterableIntMapNode() : value(-1) {}
-      IterableIntMapNode(int _value) : value(_value) {}
-      Item prev, next;
-      int value;
-    };
-  }
-
-  /// \brief Dynamic iterable integer map.
-  ///
-  /// This class provides a special graph map type which can store an
-  /// integer value for graph items (\c Node, \c Arc or \c Edge).
-  /// For each non-negative value it is possible to iterate on the keys
-  /// mapped to the value.
-  ///
-  /// This type is a reference map, so it can be modified with the
-  /// subscript operator.
-  ///
-  /// \note The size of the data structure depends on the largest
-  /// value in the map.
-  ///
-  /// \tparam GR The graph type.
-  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
-  /// \c GR::Edge).
-  ///
-  /// \see IterableBoolMap, IterableValueMap
-  /// \see CrossRefMap
-  template <typename GR, typename K>
-  class IterableIntMap
-    : protected ItemSetTraits<GR, K>::
-        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
-  public:
-    typedef typename ItemSetTraits<GR, K>::
-      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
-
-    /// The key type
-    typedef K Key;
-    /// The value type
-    typedef int Value;
-    /// The graph type
-    typedef GR Graph;
-
-    /// \brief Constructor of the map.
-    ///
-    /// Constructor of the map. It sets all values to -1.
-    explicit IterableIntMap(const Graph& graph)
-      : Parent(graph) {}
-
-    /// \brief Constructor of the map with a given value.
-    ///
-    /// Constructor of the map with a given value.
-    explicit IterableIntMap(const Graph& graph, int value)
-      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
-      if (value >= 0) {
-        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
-          lace(it);
-        }
-      }
-    }
-
-  private:
-
-    void unlace(const Key& key) {
-      typename Parent::Value& node = Parent::operator[](key);
-      if (node.value < 0) return;
-      if (node.prev != INVALID) {
-        Parent::operator[](node.prev).next = node.next;
-      } else {
-        _first[node.value] = node.next;
-      }
-      if (node.next != INVALID) {
-        Parent::operator[](node.next).prev = node.prev;
-      }
-      while (!_first.empty() && _first.back() == INVALID) {
-        _first.pop_back();
-      }
-    }
-
-    void lace(const Key& key) {
-      typename Parent::Value& node = Parent::operator[](key);
-      if (node.value < 0) return;
-      if (node.value >= int(_first.size())) {
-        _first.resize(node.value + 1, INVALID);
-      }
-      node.prev = INVALID;
-      node.next = _first[node.value];
-      if (node.next != INVALID) {
-        Parent::operator[](node.next).prev = key;
-      }
-      _first[node.value] = key;
-    }
-
-  public:
-
-    /// Indicates that the map is reference map.
-    typedef True ReferenceMapTag;
-
-    /// \brief Reference to the value of the map.
-    ///
-    /// This class is similar to the \c int type. It can
-    /// be converted to \c int and it has the same operators.
-    class Reference {
-      friend class IterableIntMap;
-    private:
-      Reference(IterableIntMap& map, const Key& key)
-        : _key(key), _map(map) {}
-    public:
-
-      Reference& operator=(const Reference& value) {
-        _map.set(_key, static_cast<const int&>(value));
-         return *this;
-      }
-
-      operator const int&() const {
-        return static_cast<const IterableIntMap&>(_map)[_key];
-      }
-
-      Reference& operator=(int value) {
-        _map.set(_key, value);
-        return *this;
-      }
-      Reference& operator++() {
-        _map.set(_key, _map[_key] + 1);
-        return *this;
-      }
-      int operator++(int) {
-        int value = _map[_key];
-        _map.set(_key, value + 1);
-        return value;
-      }
-      Reference& operator--() {
-        _map.set(_key, _map[_key] - 1);
-        return *this;
-      }
-      int operator--(int) {
-        int value = _map[_key];
-        _map.set(_key, value - 1);
-        return value;
-      }
-      Reference& operator+=(int value) {
-        _map.set(_key, _map[_key] + value);
-        return *this;
-      }
-      Reference& operator-=(int value) {
-        _map.set(_key, _map[_key] - value);
-        return *this;
-      }
-      Reference& operator*=(int value) {
-        _map.set(_key, _map[_key] * value);
-        return *this;
-      }
-      Reference& operator/=(int value) {
-        _map.set(_key, _map[_key] / value);
-        return *this;
-      }
-      Reference& operator%=(int value) {
-        _map.set(_key, _map[_key] % value);
-        return *this;
-      }
-      Reference& operator&=(int value) {
-        _map.set(_key, _map[_key] & value);
-        return *this;
-      }
-      Reference& operator|=(int value) {
-        _map.set(_key, _map[_key] | value);
-        return *this;
-      }
-      Reference& operator^=(int value) {
-        _map.set(_key, _map[_key] ^ value);
-        return *this;
-      }
-      Reference& operator<<=(int value) {
-        _map.set(_key, _map[_key] << value);
-        return *this;
-      }
-      Reference& operator>>=(int value) {
-        _map.set(_key, _map[_key] >> value);
-        return *this;
-      }
-
-    private:
-      Key _key;
-      IterableIntMap& _map;
-    };
-
-    /// The const reference type.
-    typedef const Value& ConstReference;
-
-    /// \brief Gives back the maximal value plus one.
-    ///
-    /// Gives back the maximal value plus one.
-    int size() const {
-      return _first.size();
-    }
-
-    /// \brief Set operation of the map.
-    ///
-    /// Set operation of the map.
-    void set(const Key& key, const Value& value) {
-      unlace(key);
-      Parent::operator[](key).value = value;
-      lace(key);
-    }
-
-    /// \brief Const subscript operator of the map.
-    ///
-    /// Const subscript operator of the map.
-    const Value& operator[](const Key& key) const {
-      return Parent::operator[](key).value;
-    }
-
-    /// \brief Subscript operator of the map.
-    ///
-    /// Subscript operator of the map.
-    Reference operator[](const Key& key) {
-      return Reference(*this, key);
-    }
-
-    /// \brief Iterator for the keys with the same value.
-    ///
-    /// Iterator for the keys with the same value. It works
-    /// like a graph item iterator, it can be converted to
-    /// the item type of the map, incremented with \c ++ operator, and
-    /// if the iterator leaves the last valid item, it will be equal to
-    /// \c INVALID.
-    class ItemIt : public Key {
-    public:
-      typedef Key Parent;
-
-      /// \brief Invalid constructor \& conversion.
-      ///
-      /// This constructor initializes the iterator to be invalid.
-      /// \sa Invalid for more details.
-      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
-
-      /// \brief Creates an iterator with a value.
-      ///
-      /// Creates an iterator with a value. It iterates on the
-      /// keys mapped to the given value.
-      /// \param map The IterableIntMap.
-      /// \param value The value.
-      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
-        if (value < 0 || value >= int(_map->_first.size())) {
-          Parent::operator=(INVALID);
-        } else {
-          Parent::operator=(_map->_first[value]);
-        }
-      }
-
-      /// \brief Increment operator.
-      ///
-      /// Increment operator.
-      ItemIt& operator++() {
-        Parent::operator=(_map->IterableIntMap::Parent::
-                          operator[](static_cast<Parent&>(*this)).next);
-        return *this;
-      }
-
-    private:
-      const IterableIntMap* _map;
-    };
-
-  protected:
-
-    virtual void erase(const Key& key) {
-      unlace(key);
-      Parent::erase(key);
-    }
-
-    virtual void erase(const std::vector<Key>& keys) {
-      for (int i = 0; i < int(keys.size()); ++i) {
-        unlace(keys[i]);
-      }
-      Parent::erase(keys);
-    }
-
-    virtual void clear() {
-      _first.clear();
-      Parent::clear();
-    }
-
-  private:
-    std::vector<Key> _first;
-  };
-
-  namespace _maps_bits {
-    template <typename Item, typename Value>
-    struct IterableValueMapNode {
-      IterableValueMapNode(Value _value = Value()) : value(_value) {}
-      Item prev, next;
-      Value value;
-    };
-  }
-
-  /// \brief Dynamic iterable map for comparable values.
-  ///
-  /// This class provides a special graph map type which can store an
-  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
-  /// For each value it is possible to iterate on the keys mapped to
-  /// the value.
-  ///
-  /// The map stores for each value a linked list with
-  /// the items which mapped to the value, and the values are stored
-  /// in balanced binary tree. The values of the map can be accessed
-  /// with stl compatible forward iterator.
-  ///
-  /// This type is not reference map, so it cannot be modified with
-  /// the subscript operator.
-  ///
-  /// \tparam GR The graph type.
-  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
-  /// \c GR::Edge).
-  /// \tparam V The value type of the map. It can be any comparable
-  /// value type.
-  ///
-  /// \see IterableBoolMap, IterableIntMap
-  /// \see CrossRefMap
-  template <typename GR, typename K, typename V>
-  class IterableValueMap
-    : protected ItemSetTraits<GR, K>::
-        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
-  public:
-    typedef typename ItemSetTraits<GR, K>::
-      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
-
-    /// The key type
-    typedef K Key;
-    /// The value type
-    typedef V Value;
-    /// The graph type
-    typedef GR Graph;
-
-  public:
-
-    /// \brief Constructor of the map with a given value.
-    ///
-    /// Constructor of the map with a given value.
-    explicit IterableValueMap(const Graph& graph,
-                              const Value& value = Value())
-      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
-      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
-        lace(it);
-      }
-    }
-
-  protected:
-
-    void unlace(const Key& key) {
-      typename Parent::Value& node = Parent::operator[](key);
-      if (node.prev != INVALID) {
-        Parent::operator[](node.prev).next = node.next;
-      } else {
-        if (node.next != INVALID) {
-          _first[node.value] = node.next;
-        } else {
-          _first.erase(node.value);
-        }
-      }
-      if (node.next != INVALID) {
-        Parent::operator[](node.next).prev = node.prev;
-      }
-    }
-
-    void lace(const Key& key) {
-      typename Parent::Value& node = Parent::operator[](key);
-      typename std::map<Value, Key>::iterator it = _first.find(node.value);
-      if (it == _first.end()) {
-        node.prev = node.next = INVALID;
-        _first.insert(std::make_pair(node.value, key));
-      } else {
-        node.prev = INVALID;
-        node.next = it->second;
-        if (node.next != INVALID) {
-          Parent::operator[](node.next).prev = key;
-        }
-        it->second = key;
-      }
-    }
-
-  public:
-
-    /// \brief Forward iterator for values.
-    ///
-    /// This iterator is an stl compatible forward
-    /// iterator on the values of the map. The values can
-    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
-    class ValueIterator
-      : public std::iterator<std::forward_iterator_tag, Value> {
-      friend class IterableValueMap;
-    private:
-      ValueIterator(typename std::map<Value, Key>::const_iterator _it)
-        : it(_it) {}
-    public:
-
-      ValueIterator() {}
-
-      ValueIterator& operator++() { ++it; return *this; }
-      ValueIterator operator++(int) {
-        ValueIterator tmp(*this);
-        operator++();
-        return tmp;
-      }
-
-      const Value& operator*() const { return it->first; }
-      const Value* operator->() const { return &(it->first); }
-
-      bool operator==(ValueIterator jt) const { return it == jt.it; }
-      bool operator!=(ValueIterator jt) const { return it != jt.it; }
-
-    private:
-      typename std::map<Value, Key>::const_iterator it;
-    };
-
-    /// \brief Returns an iterator to the first value.
-    ///
-    /// Returns an stl compatible iterator to the
-    /// first value of the map. The values of the
-    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
-    /// range.
-    ValueIterator beginValue() const {
-      return ValueIterator(_first.begin());
-    }
-
-    /// \brief Returns an iterator after the last value.
-    ///
-    /// Returns an stl compatible iterator after the
-    /// last value of the map. The values of the
-    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
-    /// range.
-    ValueIterator endValue() const {
-      return ValueIterator(_first.end());
-    }
-
-    /// \brief Set operation of the map.
-    ///
-    /// Set operation of the map.
-    void set(const Key& key, const Value& value) {
-      unlace(key);
-      Parent::operator[](key).value = value;
-      lace(key);
-    }
-
-    /// \brief Const subscript operator of the map.
-    ///
-    /// Const subscript operator of the map.
-    const Value& operator[](const Key& key) const {
-      return Parent::operator[](key).value;
-    }
-
-    /// \brief Iterator for the keys with the same value.
-    ///
-    /// Iterator for the keys with the same value. It works
-    /// like a graph item iterator, it can be converted to
-    /// the item type of the map, incremented with \c ++ operator, and
-    /// if the iterator leaves the last valid item, it will be equal to
-    /// \c INVALID.
-    class ItemIt : public Key {
-    public:
-      typedef Key Parent;
-
-      /// \brief Invalid constructor \& conversion.
-      ///
-      /// This constructor initializes the iterator to be invalid.
-      /// \sa Invalid for more details.
-      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
-
-      /// \brief Creates an iterator with a value.
-      ///
-      /// Creates an iterator with a value. It iterates on the
-      /// keys which have the given value.
-      /// \param map The IterableValueMap
-      /// \param value The value
-      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
-        typename std::map<Value, Key>::const_iterator it =
-          map._first.find(value);
-        if (it == map._first.end()) {
-          Parent::operator=(INVALID);
-        } else {
-          Parent::operator=(it->second);
-        }
-      }
-
-      /// \brief Increment operator.
-      ///
-      /// Increment Operator.
-      ItemIt& operator++() {
-        Parent::operator=(_map->IterableValueMap::Parent::
-                          operator[](static_cast<Parent&>(*this)).next);
-        return *this;
-      }
-
-
-    private:
-      const IterableValueMap* _map;
-    };
-
-  protected:
-
-    virtual void add(const Key& key) {
-      Parent::add(key);
-      unlace(key);
-    }
-
-    virtual void add(const std::vector<Key>& keys) {
-      Parent::add(keys);
-      for (int i = 0; i < int(keys.size()); ++i) {
-        lace(keys[i]);
-      }
-    }
-
-    virtual void erase(const Key& key) {
-      unlace(key);
-      Parent::erase(key);
-    }
-
-    virtual void erase(const std::vector<Key>& keys) {
-      for (int i = 0; i < int(keys.size()); ++i) {
-        unlace(keys[i]);
-      }
-      Parent::erase(keys);
-    }
-
-    virtual void build() {
-      Parent::build();
-      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
-        lace(it);
-      }
-    }
-
-    virtual void clear() {
-      _first.clear();
-      Parent::clear();
-    }
-
-  private:
-    std::map<Value, Key> _first;
-  };
-
   /// \brief Map of the source nodes of arcs in a digraph.
   ///
@@ -3396,5 +2481,5 @@
   /// whenever the digraph changes.
   ///
-  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
+  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
   /// may provide alternative ways to modify the digraph.
   /// The correct behavior of InDegMap is not guarantied if these additional
@@ -3412,5 +2497,5 @@
 
   public:
-
+    
     /// The graph type of InDegMap
     typedef GR Graph;
@@ -3526,5 +2611,5 @@
   /// whenever the digraph changes.
   ///
-  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
+  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
   /// may provide alternative ways to modify the digraph.
   /// The correct behavior of OutDegMap is not guarantied if these additional
Index: lemon/pairing_heap.h
===================================================================
--- lemon/pairing_heap.h	(revision 701)
+++ lemon/pairing_heap.h	(revision 701)
@@ -0,0 +1,469 @@
+/* -*- C++ -*-
+ *
+ * This file is a part of LEMON, a generic C++ optimization library
+ *
+ * Copyright (C) 2003-2008
+ * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Research Group on Combinatorial Optimization, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+#ifndef LEMON_PAIRING_HEAP_H
+#define LEMON_PAIRING_HEAP_H
+
+///\file
+///\ingroup auxdat
+///\brief Pairing Heap implementation.
+
+#include <vector>
+#include <functional>
+#include <lemon/math.h>
+
+namespace lemon {
+
+  /// \ingroup auxdat
+  ///
+  ///\brief Pairing Heap.
+  ///
+  ///This class implements the \e Pairing \e heap data structure. A \e heap
+  ///is a data structure for storing items with specified values called \e
+  ///priorities in such a way that finding the item with minimum priority is
+  ///efficient. \c Compare specifies the ordering of the priorities. In a heap
+  ///one can change the priority of an item, add or erase an item, etc.
+  ///
+  ///The methods \ref increase and \ref erase are not efficient in a Pairing
+  ///heap. In case of many calls to these operations, it is better to use a
+  ///\ref BinHeap "binary heap".
+  ///
+  ///\param _Prio Type of the priority of the items.
+  ///\param _ItemIntMap A read and writable Item int map, used internally
+  ///to handle the cross references.
+  ///\param _Compare A class for the ordering of the priorities. The
+  ///default is \c std::less<_Prio>.
+  ///
+  ///\sa BinHeap
+  ///\sa Dijkstra
+  ///\author Dorian Batha
+
+#ifdef DOXYGEN
+  template <typename _Prio,
+            typename _ItemIntMap,
+            typename _Compare>
+#else
+  template <typename _Prio,
+            typename _ItemIntMap,
+            typename _Compare = std::less<_Prio> >
+#endif
+  class PairingHeap {
+  public:
+    typedef _ItemIntMap ItemIntMap;
+    typedef _Prio Prio;
+    typedef typename ItemIntMap::Key Item;
+    typedef std::pair<Item,Prio> Pair;
+    typedef _Compare Compare;
+
+  private:
+    class store;
+
+    std::vector<store> container;
+    int minimum;
+    ItemIntMap &iimap;
+    Compare comp;
+    int num_items;
+
+  public:
+    ///Status of the nodes
+    enum State {
+      ///The node is in the heap
+      IN_HEAP = 0,
+      ///The node has never been in the heap
+      PRE_HEAP = -1,
+      ///The node was in the heap but it got out of it
+      POST_HEAP = -2
+    };
+
+    /// \brief The constructor
+    ///
+    /// \c _iimap should be given to the constructor, since it is
+    ///   used internally to handle the cross references.
+    explicit PairingHeap(ItemIntMap &_iimap)
+      : minimum(0), iimap(_iimap), num_items(0) {}
+
+    /// \brief The constructor
+    ///
+    /// \c _iimap should be given to the constructor, since it is used
+    /// internally to handle the cross references. \c _comp is an
+    /// object for ordering of the priorities.
+    PairingHeap(ItemIntMap &_iimap, const Compare &_comp)
+      : minimum(0), iimap(_iimap), comp(_comp), num_items(0) {}
+
+    /// \brief The number of items stored in the heap.
+    ///
+    /// Returns the number of items stored in the heap.
+    int size() const { return num_items; }
+
+    /// \brief Checks if the heap stores no items.
+    ///
+    ///   Returns \c true if and only if the heap stores no items.
+    bool empty() const { return num_items==0; }
+
+    /// \brief Make empty this heap.
+    ///
+    /// Make empty this heap. It does not change the cross reference
+    /// map.  If you want to reuse a heap what is not surely empty you
+    /// should first clear the heap and after that you should set the
+    /// cross reference map for each item to \c PRE_HEAP.
+    void clear() {
+      container.clear();
+      minimum = 0;
+      num_items = 0;
+    }
+
+    /// \brief \c item gets to the heap with priority \c value independently
+    /// if \c item was already there.
+    ///
+    /// This method calls \ref push(\c item, \c value) if \c item is not
+    /// stored in the heap and it calls \ref decrease(\c item, \c value) or
+    /// \ref increase(\c item, \c value) otherwise.
+    void set (const Item& item, const Prio& value) {
+      int i=iimap[item];
+      if ( i>=0 && container[i].in ) {
+        if ( comp(value, container[i].prio) ) decrease(item, value);
+        if ( comp(container[i].prio, value) ) increase(item, value);
+      } else push(item, value);
+    }
+
+    /// \brief Adds \c item to the heap with priority \c value.
+    ///
+    /// Adds \c item to the heap with priority \c value.
+    /// \pre \c item must not be stored in the heap.
+    void push (const Item& item, const Prio& value) {
+      int i=iimap[item];
+      if( i<0 ) {
+        int s=container.size();
+        iimap.set(item, s);
+        store st;
+        st.name=item;
+        container.push_back(st);
+        i=s;
+      } else {
+        container[i].parent=container[i].child=-1;
+        container[i].left_child=false;
+        container[i].degree=0;
+        container[i].in=true;
+      }
+
+      container[i].prio=value;
+
+      if ( num_items!=0 ) {
+        if ( comp( value, container[minimum].prio) ) {
+          fuse(i,minimum);
+          minimum=i;
+        }
+        else fuse(minimum,i);
+      }
+      else minimum=i;
+
+      ++num_items;
+    }
+
+    /// \brief Returns the item with minimum priority relative to \c Compare.
+    ///
+    /// This method returns the item with minimum priority relative to \c
+    /// Compare.
+    /// \pre The heap must be nonempty.
+    Item top() const { return container[minimum].name; }
+
+    /// \brief Returns the minimum priority relative to \c Compare.
+    ///
+    /// It returns the minimum priority relative to \c Compare.
+    /// \pre The heap must be nonempty.
+    const Prio& prio() const { return container[minimum].prio; }
+
+    /// \brief Returns the priority of \c item.
+    ///
+    /// It returns the priority of \c item.
+    /// \pre \c item must be in the heap.
+    const Prio& operator[](const Item& item) const {
+      return container[iimap[item]].prio;
+    }
+
+    /// \brief Deletes the item with minimum priority relative to \c Compare.
+    ///
+    /// This method deletes the item with minimum priority relative to \c
+    /// Compare from the heap.
+    /// \pre The heap must be non-empty.
+    void pop() {
+      int TreeArray[num_items];
+      int i=0, num_child=0, child_right = 0;
+      container[minimum].in=false;
+
+      if( -1!=container[minimum].child ) {
+        i=container[minimum].child;
+        TreeArray[num_child] = i;
+        container[i].parent = -1;
+        container[minimum].child = -1;
+
+        ++num_child;
+        int ch=-1;
+        while( container[i].child!=-1 ) {
+          ch=container[i].child;
+          if( container[ch].left_child && i==container[ch].parent ) {
+            i=ch;
+            //break;
+          } else {
+            if( container[ch].left_child ) {
+              child_right=container[ch].parent;
+              container[ch].parent = i;
+              --container[i].degree;
+            }
+            else {
+              child_right=ch;
+              container[i].child=-1;
+              container[i].degree=0;
+            }
+            container[child_right].parent = -1;
+            TreeArray[num_child] = child_right;
+            i = child_right;
+            ++num_child;
+          }
+        }
+
+        int other;
+        for( i=0; i<num_child-1; i+=2 ) {
+          if ( !comp(container[TreeArray[i]].prio,
+                     container[TreeArray[i+1]].prio) ) {
+            other=TreeArray[i];
+            TreeArray[i]=TreeArray[i+1];
+            TreeArray[i+1]=other;
+          }
+          fuse( TreeArray[i], TreeArray[i+1] );
+        }
+
+        i = (0==(num_child % 2)) ? num_child-2 : num_child-1;
+        while(i>=2) {
+          if ( comp(container[TreeArray[i]].prio,
+                    container[TreeArray[i-2]].prio) ) {
+            other=TreeArray[i];
+            TreeArray[i]=TreeArray[i-2];
+            TreeArray[i-2]=other;
+          }
+          fuse( TreeArray[i-2], TreeArray[i] );
+          i-=2;
+        }
+        minimum = TreeArray[0];
+      }
+
+      if ( 0==num_child ) {
+        minimum = container[minimum].child;
+      }
+
+      --num_items;
+    }
+
+    /// \brief Deletes \c item from the heap.
+    ///
+    /// This method deletes \c item from the heap, if \c item was already
+    /// stored in the heap. It is quite inefficient in Pairing heaps.
+    void erase (const Item& item) {
+      int i=iimap[item];
+      if ( i>=0 && container[i].in ) {
+        decrease( item, container[minimum].prio-1 );
+        pop();
+      }
+    }
+
+    /// \brief Decreases the priority of \c item to \c value.
+    ///
+    /// This method decreases the priority of \c item to \c value.
+    /// \pre \c item must be stored in the heap with priority at least \c
+    ///   value relative to \c Compare.
+    void decrease (Item item, const Prio& value) {
+      int i=iimap[item];
+      container[i].prio=value;
+      int p=container[i].parent;
+
+      if( container[i].left_child && i!=container[p].child ) {
+        p=container[p].parent;
+      }
+
+      if ( p!=-1 && comp(value,container[p].prio) ) {
+        cut(i,p);
+        if ( comp(container[minimum].prio,value) ) {
+          fuse(minimum,i);
+        } else {
+          fuse(i,minimum);
+          minimum=i;
+        }
+      }
+    }
+
+    /// \brief Increases the priority of \c item to \c value.
+    ///
+    /// This method sets the priority of \c item to \c value. Though
+    /// there is no precondition on the priority of \c item, this
+    /// method should be used only if it is indeed necessary to increase
+    /// (relative to \c Compare) the priority of \c item, because this
+    /// method is inefficient.
+    void increase (Item item, const Prio& value) {
+      erase(item);
+      push(item,value);
+    }
+
+    /// \brief Returns if \c item is in, has already been in, or has never
+    /// been in the heap.
+    ///
+    /// This method returns PRE_HEAP if \c item has never been in the
+    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
+    /// otherwise. In the latter case it is possible that \c item will
+    /// get back to the heap again.
+    State state(const Item &item) const {
+      int i=iimap[item];
+      if( i>=0 ) {
+        if( container[i].in ) i=0;
+        else i=-2;
+      }
+      return State(i);
+    }
+
+    /// \brief Sets the state of the \c item in the heap.
+    ///
+    /// Sets the state of the \c item in the heap. It can be used to
+    /// manually clear the heap when it is important to achive the
+    /// better time complexity.
+    /// \param i The item.
+    /// \param st The state. It should not be \c IN_HEAP.
+    void state(const Item& i, State st) {
+      switch (st) {
+      case POST_HEAP:
+      case PRE_HEAP:
+        if (state(i) == IN_HEAP) erase(i);
+        iimap[i]=st;
+        break;
+      case IN_HEAP:
+        break;
+      }
+    }
+
+  private:
+
+    void cut(int a, int b) {
+      int child_a;
+      switch (container[a].degree) {
+        case 2:
+          child_a = container[container[a].child].parent;
+          if( container[a].left_child ) {
+            container[child_a].left_child=true;
+            container[b].child=child_a;
+            container[child_a].parent=container[a].parent;
+          }
+          else {
+            container[child_a].left_child=false;
+            container[child_a].parent=b;
+            if( a!=container[b].child )
+              container[container[b].child].parent=child_a;
+            else
+              container[b].child=child_a;
+          }
+          --container[a].degree;
+          container[container[a].child].parent=a;
+          break;
+
+        case 1:
+          child_a = container[a].child;
+          if( !container[child_a].left_child ) {
+            --container[a].degree;
+            if( container[a].left_child ) {
+              container[child_a].left_child=true;
+              container[child_a].parent=container[a].parent;
+              container[b].child=child_a;
+            }
+            else {
+              container[child_a].left_child=false;
+              container[child_a].parent=b;
+              if( a!=container[b].child )
+                container[container[b].child].parent=child_a;
+              else
+                container[b].child=child_a;
+            }
+            container[a].child=-1;
+          }
+          else {
+            --container[b].degree;
+            if( container[a].left_child ) {
+              container[b].child =
+                (1==container[b].degree) ? container[a].parent : -1;
+            } else {
+              if (1==container[b].degree)
+                container[container[b].child].parent=b;
+              else
+                container[b].child=-1;
+            }
+          }
+          break;
+
+        case 0:
+          --container[b].degree;
+          if( container[a].left_child ) {
+            container[b].child =
+              (0!=container[b].degree) ? container[a].parent : -1;
+          } else {
+            if( 0!=container[b].degree )
+              container[container[b].child].parent=b;
+            else
+              container[b].child=-1;
+          }
+          break;
+      }
+      container[a].parent=-1;
+      container[a].left_child=false;
+    }
+
+    void fuse(int a, int b) {
+      int child_a = container[a].child;
+      int child_b = container[b].child;
+      container[a].child=b;
+      container[b].parent=a;
+      container[b].left_child=true;
+
+      if( -1!=child_a ) {
+        container[b].child=child_a;
+        container[child_a].parent=b;
+        container[child_a].left_child=false;
+        ++container[b].degree;
+
+        if( -1!=child_b ) {
+           container[b].child=child_b;
+           container[child_b].parent=child_a;
+        }
+      }
+      else { ++container[a].degree; }
+    }
+
+    class store {
+      friend class PairingHeap;
+
+      Item name;
+      int parent;
+      int child;
+      bool left_child;
+      int degree;
+      bool in;
+      Prio prio;
+
+      store() : parent(-1), child(-1), left_child(false), degree(0), in(true) {}
+    };
+  };
+
+} //namespace lemon
+
+#endif //LEMON_PAIRING_HEAP_H
+
Index: lemon/preflow.h
===================================================================
--- lemon/preflow.h	(revision 689)
+++ lemon/preflow.h	(revision 641)
@@ -98,5 +98,5 @@
   /// "flow of maximum value" in a digraph.
   /// The preflow algorithms are the fastest known maximum
-  /// flow algorithms. The current implementation uses a mixture of the
+  /// flow algorithms. The current implementation use a mixture of the
   /// \e "highest label" and the \e "bound decrease" heuristics.
   /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
@@ -372,9 +372,8 @@
     }
 
-    /// \brief Sets the tolerance used by the algorithm.
-    ///
-    /// Sets the tolerance object used by the algorithm.
-    /// \return <tt>(*this)</tt>
-    Preflow& tolerance(const Tolerance& tolerance) {
+    /// \brief Sets the tolerance used by algorithm.
+    ///
+    /// Sets the tolerance used by algorithm.
+    Preflow& tolerance(const Tolerance& tolerance) const {
       _tolerance = tolerance;
       return *this;
@@ -383,8 +382,7 @@
     /// \brief Returns a const reference to the tolerance.
     ///
-    /// Returns a const reference to the tolerance object used by
-    /// the algorithm.
+    /// Returns a const reference to the tolerance.
     const Tolerance& tolerance() const {
-      return _tolerance;
+      return tolerance;
     }
 
