Index: gtags
===================================================================
--- .hgtags	(revision 533)
+++ 	(revision )
@@ -1,4 +1,0 @@
-58f1a3144134042f6367fceb7eb29ee8a094d843 r1.0
-d5f1163b1522e645c938312f3f8ab303db641c12 r1.0.1
-b4c892aa217c683de570dd20908b638a78391181 r1.0.2
-a441f68fc0736bcb2323de47c71384f748069afe r1.0.3
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(revision 521)
+++ CMakeLists.txt	(revision 520)
@@ -11,13 +11,4 @@
 
 SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
-
-IF(MSVC)
-  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4250 /wd4355 /wd4800 /wd4996")
-# Suppressed warnings:
-# C4250: 'class1' : inherits 'class2::member' via dominance
-# C4355: 'this' : used in base member initializer list
-# C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning)
-# C4996: 'function': was declared deprecated
-ENDIF(MSVC)
 
 INCLUDE(FindDoxygen)
Index: NEWS
===================================================================
--- NEWS	(revision 535)
+++ NEWS	(revision 534)
@@ -5,52 +5,4 @@
         development of open-source software for the operations research
         community.
-
-2009-03-26 Version 1.0.3 released
-
-        Bugfix release, mainly targeting better AIX/xlC and WIN32
-        compatibility.
-
-        ----: Minor clarification in the LICENSE file
-        ----: Add missing unistd.h include to time_measure.h
-        #204: Compilation bug fixed in graph_to_eps.h with VS2005
-        #214,#215: windows.h is never be included by lemon headers
-        #230: Build systems check the availability of 'long long' type
-        #229: Default implementation of Tolerance<> is used for integer types
-        #211,#212: Various fixes for compiling on AIX
-        ----: Improvements in CMAKE config
-              - docs is installed in share/doc/
-              - detects newer versions of Ghostscript
-        #239: Fix missing 'inline' specifier in time_measure.h
-        
-2009-01-23 Version 1.0.2 released
-
-        Bugfix release.
-
-        #193: Bugfix in GraphReader::skipSection()
-        #195: Bugfix in ConEdgeIt()
-        #197: Bugfix in heap unionfind
-              * This bug affects Edmond's general matching algorithms.
-                (Not available in this release.)
-        #207: Fix 'make install' without 'make html' using CMAKE
-        #208: Suppress or fix VS2008 compilation warnings
-        ----: Update the LEMON icon
-        ----: Enable the component-based installer
-              (in installers made by CPACK)
-        ----: Set the proper version for CMAKE in the tarballs
-              (made by autotools).
-
-2008-12-06 Version 1.0.1 released
-
-        Bugfix release.
-
-        #170: Bugfix SmartDigraph::split()
-        #171: Bugfix in SmartGraph::restoreSnapshot()
-        #172: Extended test cases for graphs and digraphs
-        #173: Bugfix in Random
-              * operator()s always return a double now
-              * the faulty real<Num>(Num) and real<Num>(Num,Num)
-                have been removed
-        #187: Remove DijkstraWidestPathOperationTraits
-        #61:  Bugfix in DfsVisit
 
 2008-10-13 Version 1.0 released
Index: doc/groups.dox
===================================================================
--- doc/groups.dox	(revision 330)
+++ doc/groups.dox	(revision 318)
@@ -41,4 +41,16 @@
 some graph features like arc/edge or node deletion.
 
+Alteration of standard containers need a very limited number of
+operations, these together satisfy the everyday requirements.
+In the case of graph structures, different operations are needed which do
+not alter the physical graph, but gives another view. If some nodes or
+arcs have to be hidden or the reverse oriented graph have to be used, then
+this is the case. It also may happen that in a flow implementation
+the residual graph can be accessed by another algorithm, or a node-set
+is to be shrunk for another algorithm.
+LEMON also provides a variety of graphs for these requirements called
+\ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only
+in conjunction with other graph representations.
+
 You are free to use the graph structure that fit your requirements
 the best, most graph algorithms and auxiliary data structures can be used
@@ -46,4 +58,14 @@
 
 <b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
+*/
+
+/**
+@defgroup semi_adaptors Semi-Adaptor Classes for Graphs
+@ingroup graphs
+\brief Graph types between real graphs and graph adaptors.
+
+This group describes some graph types between real graphs and graph adaptors.
+These classes wrap graphs to give new functionality as the adaptors do it.
+On the other hand they are not light-weight structures as the adaptors.
 */
 
@@ -134,4 +156,12 @@
 
 /**
+@defgroup matrices Matrices
+@ingroup datas
+\brief Two dimensional data storages implemented in LEMON.
+
+This group describes two dimensional data storages implemented in LEMON.
+*/
+
+/**
 @defgroup paths Path Structures
 @ingroup datas
@@ -185,4 +215,140 @@
 
 /**
+@defgroup max_flow Maximum Flow Algorithms
+@ingroup algs
+\brief Algorithms for finding maximum flows.
+
+This group describes the algorithms for finding maximum flows and
+feasible circulations.
+
+The maximum flow problem is to find a flow between a single source and
+a single target that is maximum. Formally, there is a \f$G=(V,A)\f$
+directed graph, an \f$c_a:A\rightarrow\mathbf{R}^+_0\f$ capacity
+function and given \f$s, t \in V\f$ source and target node. The
+maximum flow is the \f$f_a\f$ solution of the next optimization problem:
+
+\f[ 0 \le f_a \le c_a \f]
+\f[ \sum_{v\in\delta^{-}(u)}f_{vu}=\sum_{v\in\delta^{+}(u)}f_{uv}
+\qquad \forall u \in V \setminus \{s,t\}\f]
+\f[ \max \sum_{v\in\delta^{+}(s)}f_{uv} - \sum_{v\in\delta^{-}(s)}f_{vu}\f]
+
+LEMON contains several algorithms for solving maximum flow problems:
+- \ref lemon::EdmondsKarp "Edmonds-Karp"
+- \ref lemon::Preflow "Goldberg's Preflow algorithm"
+- \ref lemon::DinitzSleatorTarjan "Dinitz's blocking flow algorithm with dynamic trees"
+- \ref lemon::GoldbergTarjan "Preflow algorithm with dynamic trees"
+
+In most cases the \ref lemon::Preflow "Preflow" algorithm provides the
+fastest method to compute the maximum flow. All impelementations
+provides functions to query the minimum cut, which is the dual linear
+programming problem of the maximum flow.
+*/
+
+/**
+@defgroup min_cost_flow Minimum Cost Flow Algorithms
+@ingroup algs
+
+\brief Algorithms for finding minimum cost flows and circulations.
+
+This group describes the algorithms for finding minimum cost flows and
+circulations.
+*/
+
+/**
+@defgroup min_cut Minimum Cut Algorithms
+@ingroup algs
+
+\brief Algorithms for finding minimum cut in graphs.
+
+This group describes the algorithms for finding minimum cut in graphs.
+
+The minimum cut problem is to find a non-empty and non-complete
+\f$X\f$ subset of the vertices with minimum overall capacity on
+outgoing arcs. Formally, there is \f$G=(V,A)\f$ directed graph, an
+\f$c_a:A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
+cut is the \f$X\f$ solution of the next optimization problem:
+
+\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
+\sum_{uv\in A, u\in X, v\not\in X}c_{uv}\f]
+
+LEMON contains several algorithms related to minimum cut problems:
+
+- \ref lemon::HaoOrlin "Hao-Orlin algorithm" to calculate minimum cut
+  in directed graphs
+- \ref lemon::NagamochiIbaraki "Nagamochi-Ibaraki algorithm" to
+  calculate minimum cut in undirected graphs
+- \ref lemon::GomoryHuTree "Gomory-Hu tree computation" to calculate all
+  pairs minimum cut in undirected graphs
+
+If you want to find minimum cut just between two distinict nodes,
+please see the \ref max_flow "Maximum Flow page".
+*/
+
+/**
+@defgroup graph_prop Connectivity and Other Graph Properties
+@ingroup algs
+\brief Algorithms for discovering the graph properties
+
+This group describes the algorithms for discovering the graph properties
+like connectivity, bipartiteness, euler property, simplicity etc.
+
+\image html edge_biconnected_components.png
+\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
+*/
+
+/**
+@defgroup planar Planarity Embedding and Drawing
+@ingroup algs
+\brief Algorithms for planarity checking, embedding and drawing
+
+This group describes the algorithms for planarity checking,
+embedding and drawing.
+
+\image html planar.png
+\image latex planar.eps "Plane graph" width=\textwidth
+*/
+
+/**
+@defgroup matching Matching Algorithms
+@ingroup algs
+\brief Algorithms for finding matchings in graphs and bipartite graphs.
+
+This group contains algorithm objects and functions to calculate
+matchings in graphs and bipartite graphs. The general matching problem is
+finding a subset of the arcs which does not shares common endpoints.
+
+There are several different algorithms for calculate matchings in
+graphs.  The matching problems in bipartite graphs are generally
+easier than in general graphs. The goal of the matching optimization
+can be the finding maximum cardinality, maximum weight or minimum cost
+matching. The search can be constrained to find perfect or
+maximum cardinality matching.
+
+LEMON contains the next algorithms:
+- \ref lemon::MaxBipartiteMatching "MaxBipartiteMatching" Hopcroft-Karp
+  augmenting path algorithm for calculate maximum cardinality matching in
+  bipartite graphs
+- \ref lemon::PrBipartiteMatching "PrBipartiteMatching" Push-Relabel
+  algorithm for calculate maximum cardinality matching in bipartite graphs
+- \ref lemon::MaxWeightedBipartiteMatching "MaxWeightedBipartiteMatching"
+  Successive shortest path algorithm for calculate maximum weighted matching
+  and maximum weighted bipartite matching in bipartite graph
+- \ref lemon::MinCostMaxBipartiteMatching "MinCostMaxBipartiteMatching"
+  Successive shortest path algorithm for calculate minimum cost maximum
+  matching in bipartite graph
+- \ref lemon::MaxMatching "MaxMatching" Edmond's blossom shrinking algorithm
+  for calculate maximum cardinality matching in general graph
+- \ref lemon::MaxWeightedMatching "MaxWeightedMatching" Edmond's blossom
+  shrinking algorithm for calculate maximum weighted matching in general
+  graph
+- \ref lemon::MaxWeightedPerfectMatching "MaxWeightedPerfectMatching"
+  Edmond's blossom shrinking algorithm for calculate maximum weighted
+  perfect matching in general graph
+
+\image html bipartite_matching.png
+\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
+*/
+
+/**
 @defgroup spantree Minimum Spanning Tree Algorithms
 @ingroup algs
@@ -191,4 +357,58 @@
 This group describes the algorithms for finding a minimum cost spanning
 tree in a graph
+*/
+
+/**
+@defgroup auxalg Auxiliary Algorithms
+@ingroup algs
+\brief Auxiliary algorithms implemented in LEMON.
+
+This group describes some algorithms implemented in LEMON
+in order to make it easier to implement complex algorithms.
+*/
+
+/**
+@defgroup approx Approximation Algorithms
+@ingroup algs
+\brief Approximation algorithms.
+
+This group describes the approximation and heuristic algorithms
+implemented in LEMON.
+*/
+
+/**
+@defgroup gen_opt_group General Optimization Tools
+\brief This group describes some general optimization frameworks
+implemented in LEMON.
+
+This group describes some general optimization frameworks
+implemented in LEMON.
+*/
+
+/**
+@defgroup lp_group Lp and Mip Solvers
+@ingroup gen_opt_group
+\brief Lp and Mip solver interfaces for LEMON.
+
+This group describes Lp and Mip solver interfaces for LEMON. The
+various LP solvers could be used in the same manner with this
+interface.
+*/
+
+/**
+@defgroup lp_utils Tools for Lp and Mip Solvers
+@ingroup lp_group
+\brief Helper tools to the Lp and Mip solvers.
+
+This group adds some helper tools to general optimization framework
+implemented in LEMON.
+*/
+
+/**
+@defgroup metah Metaheuristics
+@ingroup gen_opt_group
+\brief Metaheuristics for LEMON library.
+
+This group describes some metaheuristic optimization tools.
 */
 
@@ -239,6 +459,6 @@
 
 This group describes the tools for importing and exporting graphs
-and graph related data. Now it supports the LEMON format
-and the encapsulated postscript (EPS) format.
+and graph related data. Now it supports the \ref lgf-format
+"LEMON Graph Format", the \c DIMACS format and the encapsulated
 postscript (EPS) format.
 */
@@ -304,5 +524,5 @@
 @ingroup concept
 \brief Skeleton and concept checking classes for maps
- 
+
 This group describes the skeletons and concept checking classes of maps.
 */
@@ -319,2 +539,12 @@
 build the library.
 */
+
+/**
+@defgroup tools Standalone utility applications
+
+Some utility applications are listed here.
+
+The standard compilation procedure (<tt>./configure;make</tt>) will compile
+them, as well.
+*/
+
Index: doc/mainpage.dox
===================================================================
--- doc/mainpage.dox	(revision 332)
+++ doc/mainpage.dox	(revision 314)
@@ -42,4 +42,15 @@
 \subsection howtoread How to read the documentation
 
+If you want to get a quick start and see the most important features then
+take a look at our \ref quicktour
+"Quick Tour to LEMON" which will guide you along.
+
+If you already feel like using our library, see the page that tells you
+\ref getstart "How to start using LEMON".
+
+If you
+want to see how LEMON works, see
+some \ref demoprograms "demo programs".
+
 If you know what you are looking for then try to find it under the
 <a class="el" href="modules.html">Modules</a>
Index: lemon/base.cc
===================================================================
--- lemon/base.cc	(revision 500)
+++ lemon/base.cc	(revision 220)
@@ -24,5 +24,5 @@
 namespace lemon {
 
-  float Tolerance<float>::def_epsilon = static_cast<float>(1e-4);
+  float Tolerance<float>::def_epsilon = 1e-4;
   double Tolerance<double>::def_epsilon = 1e-10;
   long double Tolerance<long double>::def_epsilon = 1e-14;
Index: lemon/dfs.h
===================================================================
--- lemon/dfs.h	(revision 436)
+++ lemon/dfs.h	(revision 319)
@@ -1414,5 +1414,4 @@
           } else {
             _visitor->leave(s);
-            _visitor->stop(s);
           }
         }
Index: lemon/lgf_reader.h
===================================================================
--- lemon/lgf_reader.h	(revision 519)
+++ lemon/lgf_reader.h	(revision 517)
@@ -848,7 +848,5 @@
         readLine();
       }
-      if (readSuccess()) {
-        line.putback(c);
-      }
+      line.putback(c);
     }
 
@@ -1690,7 +1688,5 @@
         readLine();
       }
-      if (readSuccess()) {
-        line.putback(c);
-      }
+      line.putback(c);
     }
 
@@ -2249,7 +2245,5 @@
         readLine();
       }
-      if (readSuccess()) {
-        line.putback(c);
-      }
+      line.putback(c);
     }
 
@@ -2592,7 +2586,5 @@
         readLine();
       }
-      if (readSuccess()) {
-        line.putback(c);
-      }
+      line.putback(c);
     }
 
Index: lemon/maps.h
===================================================================
--- lemon/maps.h	(revision 327)
+++ lemon/maps.h	(revision 314)
@@ -1856,4 +1856,405 @@
     InverseMap inverse() const { return InverseMap(*_graph);}
 
+  };
+
+
+  /// \brief General invertable graph-map type.
+
+  /// This type provides simple invertable graph-maps.
+  /// The InvertableMap wraps an arbitrary 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.
+  ///
+  /// \tparam _Graph The graph type.
+  /// \tparam _Item The item type of the graph.
+  /// \tparam _Value The value type of the map.
+  ///
+  /// \see IterableValueMap
+  template <typename _Graph, typename _Item, typename _Value>
+  class InvertableMap
+    : protected ItemSetTraits<_Graph, _Item>::template Map<_Value>::Type {
+  private:
+
+    typedef typename ItemSetTraits<_Graph, _Item>::
+    template Map<_Value>::Type Map;
+    typedef _Graph Graph;
+
+    typedef std::map<_Value, _Item> Container;
+    Container _inv_map;
+
+  public:
+
+    /// The key type of InvertableMap (Node, Arc, Edge).
+    typedef typename Map::Key Key;
+    /// The value type of the InvertableMap.
+    typedef typename Map::Value Value;
+
+    /// \brief Constructor.
+    ///
+    /// Construct a new InvertableMap for the graph.
+    ///
+    explicit InvertableMap(const Graph& graph) : Map(graph) {}
+
+    /// \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 [beginValue, endValue) range.
+    ///
+    class ValueIterator
+      : public std::iterator<std::forward_iterator_tag, Value> {
+      friend class InvertableMap;
+    private:
+      ValueIterator(typename Container::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 Container::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 [beginValue, endValue)
+    /// range.
+    ValueIterator beginValue() const {
+      return ValueIterator(_inv_map.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 [beginValue, endValue)
+    /// range.
+    ValueIterator endValue() const {
+      return ValueIterator(_inv_map.end());
+    }
+
+    /// \brief The setter function of the map.
+    ///
+    /// Sets the mapped value.
+    void set(const Key& key, const Value& val) {
+      Value oldval = Map::operator[](key);
+      typename Container::iterator it = _inv_map.find(oldval);
+      if (it != _inv_map.end() && it->second == key) {
+        _inv_map.erase(it);
+      }
+      _inv_map.insert(make_pair(val, key));
+      Map::set(key, val);
+    }
+
+    /// \brief The getter function of the map.
+    ///
+    /// It gives back the value associated with the key.
+    typename MapTraits<Map>::ConstReturnValue
+    operator[](const Key& key) const {
+      return Map::operator[](key);
+    }
+
+    /// \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;
+    }
+
+  protected:
+
+    /// \brief Erase the key from the map.
+    ///
+    /// Erase the key to the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void erase(const Key& key) {
+      Value val = Map::operator[](key);
+      typename Container::iterator it = _inv_map.find(val);
+      if (it != _inv_map.end() && it->second == key) {
+        _inv_map.erase(it);
+      }
+      Map::erase(key);
+    }
+
+    /// \brief Erase more keys from the map.
+    ///
+    /// Erase more keys from the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void erase(const std::vector<Key>& keys) {
+      for (int i = 0; i < int(keys.size()); ++i) {
+        Value val = Map::operator[](keys[i]);
+        typename Container::iterator it = _inv_map.find(val);
+        if (it != _inv_map.end() && it->second == keys[i]) {
+          _inv_map.erase(it);
+        }
+      }
+      Map::erase(keys);
+    }
+
+    /// \brief Clear the keys from the map and inverse map.
+    ///
+    /// Clear the keys from the map and inverse map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void clear() {
+      _inv_map.clear();
+      Map::clear();
+    }
+
+  public:
+
+    /// \brief The inverse map type.
+    ///
+    /// The inverse of this map. The subscript operator of the map
+    /// gives back always the item what was last assigned to the value.
+    class InverseMap {
+    public:
+      /// \brief Constructor of the InverseMap.
+      ///
+      /// Constructor of the InverseMap.
+      explicit InverseMap(const InvertableMap& inverted)
+        : _inverted(inverted) {}
+
+      /// The value type of the InverseMap.
+      typedef typename InvertableMap::Key Value;
+      /// The key type of the InverseMap.
+      typedef typename InvertableMap::Value Key;
+
+      /// \brief Subscript operator.
+      ///
+      /// Subscript operator. It gives back always the item
+      /// what was last assigned to the value.
+      Value operator[](const Key& key) const {
+        return _inverted(key);
+      }
+
+    private:
+      const InvertableMap& _inverted;
+    };
+
+    /// \brief It gives back the just readable inverse map.
+    ///
+    /// It gives back the just readable inverse map.
+    InverseMap inverse() const {
+      return InverseMap(*this);
+    }
+
+  };
+
+  /// \brief Provides a mutable, continuous and unique descriptor for each
+  /// item in the graph.
+  ///
+  /// The DescriptorMap class provides a unique and continuous (but mutable)
+  /// descriptor (id) for each item of the same type (e.g. node) in the
+  /// graph. This id is <ul><li>\b unique: different items (nodes) get
+  /// different ids <li>\b continuous: the range of the ids is the set of
+  /// integers between 0 and \c n-1, where \c n is the number of the items of
+  /// this type (e.g. nodes) (so the id of a node can change if you delete an
+  /// other node, i.e. this id is mutable).  </ul> This map can be inverted
+  /// with its member class \c InverseMap, or with the \c operator() member.
+  ///
+  /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
+  /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or
+  /// Edge.
+  template <typename _Graph, typename _Item>
+  class DescriptorMap
+    : protected ItemSetTraits<_Graph, _Item>::template Map<int>::Type {
+
+    typedef _Item Item;
+    typedef typename ItemSetTraits<_Graph, _Item>::template Map<int>::Type Map;
+
+  public:
+    /// The graph class of DescriptorMap.
+    typedef _Graph Graph;
+
+    /// The key type of DescriptorMap (Node, Arc, Edge).
+    typedef typename Map::Key Key;
+    /// The value type of DescriptorMap.
+    typedef typename Map::Value Value;
+
+    /// \brief Constructor.
+    ///
+    /// Constructor for descriptor map.
+    explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
+      Item it;
+      const typename Map::Notifier* nf = Map::notifier();
+      for (nf->first(it); it != INVALID; nf->next(it)) {
+        Map::set(it, _inv_map.size());
+        _inv_map.push_back(it);
+      }
+    }
+
+  protected:
+
+    /// \brief Add a new key to the map.
+    ///
+    /// Add a new key to the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void add(const Item& item) {
+      Map::add(item);
+      Map::set(item, _inv_map.size());
+      _inv_map.push_back(item);
+    }
+
+    /// \brief Add more new keys to the map.
+    ///
+    /// Add more new keys to the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void add(const std::vector<Item>& items) {
+      Map::add(items);
+      for (int i = 0; i < int(items.size()); ++i) {
+        Map::set(items[i], _inv_map.size());
+        _inv_map.push_back(items[i]);
+      }
+    }
+
+    /// \brief Erase the key from the map.
+    ///
+    /// Erase the key from the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void erase(const Item& item) {
+      Map::set(_inv_map.back(), Map::operator[](item));
+      _inv_map[Map::operator[](item)] = _inv_map.back();
+      _inv_map.pop_back();
+      Map::erase(item);
+    }
+
+    /// \brief Erase more keys from the map.
+    ///
+    /// Erase more keys from the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void erase(const std::vector<Item>& items) {
+      for (int i = 0; i < int(items.size()); ++i) {
+        Map::set(_inv_map.back(), Map::operator[](items[i]));
+        _inv_map[Map::operator[](items[i])] = _inv_map.back();
+        _inv_map.pop_back();
+      }
+      Map::erase(items);
+    }
+
+    /// \brief Build the unique map.
+    ///
+    /// Build the unique map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void build() {
+      Map::build();
+      Item it;
+      const typename Map::Notifier* nf = Map::notifier();
+      for (nf->first(it); it != INVALID; nf->next(it)) {
+        Map::set(it, _inv_map.size());
+        _inv_map.push_back(it);
+      }
+    }
+
+    /// \brief Clear the keys from the map.
+    ///
+    /// Clear the keys from the map. It is called by the
+    /// \c AlterationNotifier.
+    virtual void clear() {
+      _inv_map.clear();
+      Map::clear();
+    }
+
+  public:
+
+    /// \brief Returns the maximal value plus one.
+    ///
+    /// Returns the maximal value plus one in the map.
+    unsigned int size() const {
+      return _inv_map.size();
+    }
+
+    /// \brief Swaps the position of the two items in the map.
+    ///
+    /// Swaps the position of the two items in the map.
+    void swap(const Item& p, const Item& q) {
+      int pi = Map::operator[](p);
+      int qi = Map::operator[](q);
+      Map::set(p, qi);
+      _inv_map[qi] = p;
+      Map::set(q, pi);
+      _inv_map[pi] = q;
+    }
+
+    /// \brief Gives back the \e descriptor of the item.
+    ///
+    /// Gives back the mutable and unique \e descriptor of the map.
+    int operator[](const Item& item) const {
+      return Map::operator[](item);
+    }
+
+    /// \brief Gives back the item by its descriptor.
+    ///
+    /// Gives back th item by its descriptor.
+    Item operator()(int id) const {
+      return _inv_map[id];
+    }
+
+  private:
+
+    typedef std::vector<Item> Container;
+    Container _inv_map;
+
+  public:
+    /// \brief The inverse map type of DescriptorMap.
+    ///
+    /// The inverse map type of DescriptorMap.
+    class InverseMap {
+    public:
+      /// \brief Constructor of the InverseMap.
+      ///
+      /// Constructor of the InverseMap.
+      explicit InverseMap(const DescriptorMap& inverted)
+        : _inverted(inverted) {}
+
+
+      /// The value type of the InverseMap.
+      typedef typename DescriptorMap::Key Value;
+      /// The key type of the InverseMap.
+      typedef typename DescriptorMap::Value Key;
+
+      /// \brief Subscript operator.
+      ///
+      /// Subscript operator. It gives back the item
+      /// that the descriptor belongs to currently.
+      Value operator[](const Key& key) const {
+        return _inverted(key);
+      }
+
+      /// \brief Size of the map.
+      ///
+      /// Returns the size of the map.
+      unsigned int size() const {
+        return _inverted.size();
+      }
+
+    private:
+      const DescriptorMap& _inverted;
+    };
+
+    /// \brief Gives back the inverse of the map.
+    ///
+    /// Gives back the inverse of the map.
+    const InverseMap inverse() const {
+      return InverseMap(*this);
+    }
   };
 
Index: lemon/smart_graph.h
===================================================================
--- lemon/smart_graph.h	(revision 386)
+++ lemon/smart_graph.h	(revision 313)
@@ -306,7 +306,5 @@
       nodes[b._id].first_out=nodes[n._id].first_out;
       nodes[n._id].first_out=-1;
-      for(int i=nodes[b._id].first_out; i!=-1; i=arcs[i].next_out) {
-        arcs[i].source=b._id;
-      }
+      for(int i=nodes[b._id].first_out;i!=-1;i++) arcs[i].source=b._id;
       if(connect) addArc(n,b);
       return b;
@@ -731,6 +729,6 @@
         dir.push_back(arcFromId(n-1));
         Parent::notifier(Arc()).erase(dir);
-        nodes[arcs[n-1].target].first_out=arcs[n].next_out;
-        nodes[arcs[n].target].first_out=arcs[n-1].next_out;
+        nodes[arcs[n].target].first_out=arcs[n].next_out;
+        nodes[arcs[n-1].target].first_out=arcs[n-1].next_out;
         arcs.pop_back();
         arcs.pop_back();
Index: scripts/unify-sources.sh
===================================================================
--- scripts/unify-sources.sh	(revision 208)
+++ scripts/unify-sources.sh	(revision 538)
@@ -1,6 +1,15 @@
 #!/bin/bash
 
-YEAR=`date +2003-%Y`
+YEAR=`date +%Y`
 HGROOT=`hg root`
+
+function hg_year() {
+    if [ -n "$(hg st $1)" ]; then
+        echo $YEAR
+    else
+        hg log -l 1 --template='{date|isodate}\n' $1 |
+        cut -d '-' -f 1
+    fi
+}
 
 function update_header() {
@@ -12,5 +21,5 @@
  * This file is a part of LEMON, a generic C++ optimization library.
  *
- * Copyright (C) "$YEAR"
+ * Copyright (C) 2003-"$(hg_year $1)"
  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
  * (Egervary Research Group on Combinatorial Optimization, EGRES).
Index: test/digraph_test.cc
===================================================================
--- test/digraph_test.cc	(revision 387)
+++ test/digraph_test.cc	(revision 228)
@@ -30,5 +30,5 @@
 
 template <class Digraph>
-void checkDigraphBuild() {
+void checkDigraph() {
   TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
   Digraph G;
@@ -59,206 +59,5 @@
   checkGraphConArcList(G, 1);
 
-  Arc a2 = G.addArc(n2, n1),
-      a3 = G.addArc(n2, n3),
-      a4 = G.addArc(n2, n3);
-
-  checkGraphNodeList(G, 3);
-  checkGraphArcList(G, 4);
-
-  checkGraphOutArcList(G, n1, 1);
-  checkGraphOutArcList(G, n2, 3);
-  checkGraphOutArcList(G, n3, 0);
-
-  checkGraphInArcList(G, n1, 1);
-  checkGraphInArcList(G, n2, 1);
-  checkGraphInArcList(G, n3, 2);
-
-  checkGraphConArcList(G, 4);
-
-  checkNodeIds(G);
-  checkArcIds(G);
-  checkGraphNodeMap(G);
-  checkGraphArcMap(G);
-}
-
-template <class Digraph>
-void checkDigraphSplit() {
-  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
-
-  Digraph G;
-  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
-  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
-      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
-
-  Node n4 = G.split(n2);
-
-  check(G.target(OutArcIt(G, n2)) == n4 &&
-        G.source(InArcIt(G, n4)) == n2,
-        "Wrong split.");
-
-  checkGraphNodeList(G, 4);
-  checkGraphArcList(G, 5);
-
-  checkGraphOutArcList(G, n1, 1);
-  checkGraphOutArcList(G, n2, 1);
-  checkGraphOutArcList(G, n3, 0);
-  checkGraphOutArcList(G, n4, 3);
-
-  checkGraphInArcList(G, n1, 1);
-  checkGraphInArcList(G, n2, 1);
-  checkGraphInArcList(G, n3, 2);
-  checkGraphInArcList(G, n4, 1);
-
-  checkGraphConArcList(G, 5);
-}
-
-template <class Digraph>
-void checkDigraphAlter() {
-  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
-
-  Digraph G;
-  Node n1 = G.addNode(), n2 = G.addNode(),
-       n3 = G.addNode(), n4 = G.addNode();
-  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
-      a3 = G.addArc(n4, n3), a4 = G.addArc(n4, n3),
-      a5 = G.addArc(n2, n4);
-
-  checkGraphNodeList(G, 4);
-  checkGraphArcList(G, 5);
-
-  // Check changeSource() and changeTarget()
-  G.changeTarget(a4, n1);
-
-  checkGraphNodeList(G, 4);
-  checkGraphArcList(G, 5);
-
-  checkGraphOutArcList(G, n1, 1);
-  checkGraphOutArcList(G, n2, 1);
-  checkGraphOutArcList(G, n3, 0);
-  checkGraphOutArcList(G, n4, 3);
-
-  checkGraphInArcList(G, n1, 2);
-  checkGraphInArcList(G, n2, 1);
-  checkGraphInArcList(G, n3, 1);
-  checkGraphInArcList(G, n4, 1);
-
-  checkGraphConArcList(G, 5);
-
-  G.changeSource(a4, n3);
-
-  checkGraphNodeList(G, 4);
-  checkGraphArcList(G, 5);
-
-  checkGraphOutArcList(G, n1, 1);
-  checkGraphOutArcList(G, n2, 1);
-  checkGraphOutArcList(G, n3, 1);
-  checkGraphOutArcList(G, n4, 2);
-
-  checkGraphInArcList(G, n1, 2);
-  checkGraphInArcList(G, n2, 1);
-  checkGraphInArcList(G, n3, 1);
-  checkGraphInArcList(G, n4, 1);
-
-  checkGraphConArcList(G, 5);
-
-  // Check contract()
-  G.contract(n2, n4, false);
-
-  checkGraphNodeList(G, 3);
-  checkGraphArcList(G, 5);
-
-  checkGraphOutArcList(G, n1, 1);
-  checkGraphOutArcList(G, n2, 3);
-  checkGraphOutArcList(G, n3, 1);
-
-  checkGraphInArcList(G, n1, 2);
-  checkGraphInArcList(G, n2, 2);
-  checkGraphInArcList(G, n3, 1);
-
-  checkGraphConArcList(G, 5);
-
-  G.contract(n2, n1);
-
-  checkGraphNodeList(G, 2);
-  checkGraphArcList(G, 3);
-
-  checkGraphOutArcList(G, n2, 2);
-  checkGraphOutArcList(G, n3, 1);
-
-  checkGraphInArcList(G, n2, 2);
-  checkGraphInArcList(G, n3, 1);
-
-  checkGraphConArcList(G, 3);
-}
-
-template <class Digraph>
-void checkDigraphErase() {
-  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
-
-  Digraph G;
-  Node n1 = G.addNode(), n2 = G.addNode(),
-       n3 = G.addNode(), n4 = G.addNode();
-  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
-      a3 = G.addArc(n4, n3), a4 = G.addArc(n3, n1),
-      a5 = G.addArc(n2, n4);
-
-  // Check arc deletion
-  G.erase(a1);
-
-  checkGraphNodeList(G, 4);
-  checkGraphArcList(G, 4);
-
-  checkGraphOutArcList(G, n1, 0);
-  checkGraphOutArcList(G, n2, 1);
-  checkGraphOutArcList(G, n3, 1);
-  checkGraphOutArcList(G, n4, 2);
-
-  checkGraphInArcList(G, n1, 2);
-  checkGraphInArcList(G, n2, 0);
-  checkGraphInArcList(G, n3, 1);
-  checkGraphInArcList(G, n4, 1);
-
-  checkGraphConArcList(G, 4);
-
-  // Check node deletion
-  G.erase(n4);
-
-  checkGraphNodeList(G, 3);
-  checkGraphArcList(G, 1);
-
-  checkGraphOutArcList(G, n1, 0);
-  checkGraphOutArcList(G, n2, 0);
-  checkGraphOutArcList(G, n3, 1);
-  checkGraphOutArcList(G, n4, 0);
-
-  checkGraphInArcList(G, n1, 1);
-  checkGraphInArcList(G, n2, 0);
-  checkGraphInArcList(G, n3, 0);
-  checkGraphInArcList(G, n4, 0);
-
-  checkGraphConArcList(G, 1);
-}
-
-
-template <class Digraph>
-void checkDigraphSnapshot() {
-  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
-
-  Digraph G;
-  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
-  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
-      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
-
-  typename Digraph::Snapshot snapshot(G);
-
-  Node n = G.addNode();
-  G.addArc(n3, n);
-  G.addArc(n, n3);
-
-  checkGraphNodeList(G, 4);
-  checkGraphArcList(G, 6);
-
-  snapshot.restore();
-
+  Arc a2 = G.addArc(n2, n1), a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
   checkGraphNodeList(G, 3);
   checkGraphArcList(G, 4);
@@ -279,14 +78,6 @@
   checkGraphArcMap(G);
 
-  G.addNode();
-  snapshot.save(G);
+}
 
-  G.addArc(G.addNode(), G.addNode());
-
-  snapshot.restore();
-
-  checkGraphNodeList(G, 4);
-  checkGraphArcList(G, 4);
-}
 
 void checkConcepts() {
@@ -379,15 +170,9 @@
 void checkDigraphs() {
   { // Checking ListDigraph
-    checkDigraphBuild<ListDigraph>();
-    checkDigraphSplit<ListDigraph>();
-    checkDigraphAlter<ListDigraph>();
-    checkDigraphErase<ListDigraph>();
-    checkDigraphSnapshot<ListDigraph>();
+    checkDigraph<ListDigraph>();
     checkDigraphValidityErase<ListDigraph>();
   }
   { // Checking SmartDigraph
-    checkDigraphBuild<SmartDigraph>();
-    checkDigraphSplit<SmartDigraph>();
-    checkDigraphSnapshot<SmartDigraph>();
+    checkDigraph<SmartDigraph>();
     checkDigraphValidity<SmartDigraph>();
   }
Index: test/graph_test.cc
===================================================================
--- test/graph_test.cc	(revision 387)
+++ test/graph_test.cc	(revision 228)
@@ -30,5 +30,5 @@
 
 template <class Graph>
-void checkGraphBuild() {
+void checkGraph() {
   TEMPLATE_GRAPH_TYPEDEFS(Graph);
 
@@ -36,5 +36,4 @@
   checkGraphNodeList(G, 0);
   checkGraphEdgeList(G, 0);
-  checkGraphArcList(G, 0);
 
   Node
@@ -44,34 +43,46 @@
   checkGraphNodeList(G, 3);
   checkGraphEdgeList(G, 0);
-  checkGraphArcList(G, 0);
 
   Edge e1 = G.addEdge(n1, n2);
   check((G.u(e1) == n1 && G.v(e1) == n2) || (G.u(e1) == n2 && G.v(e1) == n1),
         "Wrong edge");
-
   checkGraphNodeList(G, 3);
+  checkGraphArcList(G, 2);
   checkGraphEdgeList(G, 1);
-  checkGraphArcList(G, 2);
-
-  checkGraphIncEdgeArcLists(G, n1, 1);
-  checkGraphIncEdgeArcLists(G, n2, 1);
-  checkGraphIncEdgeArcLists(G, n3, 0);
-
+
+  checkGraphOutArcList(G, n1, 1);
+  checkGraphOutArcList(G, n2, 1);
+  checkGraphOutArcList(G, n3, 0);
+
+  checkGraphInArcList(G, n1, 1);
+  checkGraphInArcList(G, n2, 1);
+  checkGraphInArcList(G, n3, 0);
+
+  checkGraphIncEdgeList(G, n1, 1);
+  checkGraphIncEdgeList(G, n2, 1);
+  checkGraphIncEdgeList(G, n3, 0);
+
+  checkGraphConArcList(G, 2);
   checkGraphConEdgeList(G, 1);
-  checkGraphConArcList(G, 2);
-
-  Edge e2 = G.addEdge(n2, n1),
-       e3 = G.addEdge(n2, n3);
-
+
+  Edge e2 = G.addEdge(n2, n1), e3 = G.addEdge(n2, n3);
   checkGraphNodeList(G, 3);
+  checkGraphArcList(G, 6);
   checkGraphEdgeList(G, 3);
-  checkGraphArcList(G, 6);
-
-  checkGraphIncEdgeArcLists(G, n1, 2);
-  checkGraphIncEdgeArcLists(G, n2, 3);
-  checkGraphIncEdgeArcLists(G, n3, 1);
-
+
+  checkGraphOutArcList(G, n1, 2);
+  checkGraphOutArcList(G, n2, 3);
+  checkGraphOutArcList(G, n3, 1);
+
+  checkGraphInArcList(G, n1, 2);
+  checkGraphInArcList(G, n2, 3);
+  checkGraphInArcList(G, n3, 1);
+
+  checkGraphIncEdgeList(G, n1, 2);
+  checkGraphIncEdgeList(G, n2, 3);
+  checkGraphIncEdgeList(G, n3, 1);
+
+  checkGraphConArcList(G, 6);
   checkGraphConEdgeList(G, 3);
-  checkGraphConArcList(G, 6);
 
   checkArcDirections(G);
@@ -83,181 +94,4 @@
   checkGraphArcMap(G);
   checkGraphEdgeMap(G);
-}
-
-template <class Graph>
-void checkGraphAlter() {
-  TEMPLATE_GRAPH_TYPEDEFS(Graph);
-
-  Graph G;
-  Node n1 = G.addNode(), n2 = G.addNode(),
-       n3 = G.addNode(), n4 = G.addNode();
-  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
-       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
-       e5 = G.addEdge(n4, n3);
-
-  checkGraphNodeList(G, 4);
-  checkGraphEdgeList(G, 5);
-  checkGraphArcList(G, 10);
-
-  // Check changeU() and changeV()
-  if (G.u(e2) == n2) {
-    G.changeU(e2, n3);
-  } else {
-    G.changeV(e2, n3);
-  }
-
-  checkGraphNodeList(G, 4);
-  checkGraphEdgeList(G, 5);
-  checkGraphArcList(G, 10);
-
-  checkGraphIncEdgeArcLists(G, n1, 3);
-  checkGraphIncEdgeArcLists(G, n2, 2);
-  checkGraphIncEdgeArcLists(G, n3, 3);
-  checkGraphIncEdgeArcLists(G, n4, 2);
-
-  checkGraphConEdgeList(G, 5);
-  checkGraphConArcList(G, 10);
-
-  if (G.u(e2) == n1) {
-    G.changeU(e2, n2);
-  } else {
-    G.changeV(e2, n2);
-  }
-
-  checkGraphNodeList(G, 4);
-  checkGraphEdgeList(G, 5);
-  checkGraphArcList(G, 10);
-
-  checkGraphIncEdgeArcLists(G, n1, 2);
-  checkGraphIncEdgeArcLists(G, n2, 3);
-  checkGraphIncEdgeArcLists(G, n3, 3);
-  checkGraphIncEdgeArcLists(G, n4, 2);
-
-  checkGraphConEdgeList(G, 5);
-  checkGraphConArcList(G, 10);
-
-  // Check contract()
-  G.contract(n1, n4, false);
-
-  checkGraphNodeList(G, 3);
-  checkGraphEdgeList(G, 5);
-  checkGraphArcList(G, 10);
-
-  checkGraphIncEdgeArcLists(G, n1, 4);
-  checkGraphIncEdgeArcLists(G, n2, 3);
-  checkGraphIncEdgeArcLists(G, n3, 3);
-
-  checkGraphConEdgeList(G, 5);
-  checkGraphConArcList(G, 10);
-
-  G.contract(n2, n3);
-
-  checkGraphNodeList(G, 2);
-  checkGraphEdgeList(G, 3);
-  checkGraphArcList(G, 6);
-
-  checkGraphIncEdgeArcLists(G, n1, 4);
-  checkGraphIncEdgeArcLists(G, n2, 2);
-
-  checkGraphConEdgeList(G, 3);
-  checkGraphConArcList(G, 6);
-}
-
-template <class Graph>
-void checkGraphErase() {
-  TEMPLATE_GRAPH_TYPEDEFS(Graph);
-
-  Graph G;
-  Node n1 = G.addNode(), n2 = G.addNode(),
-       n3 = G.addNode(), n4 = G.addNode();
-  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
-       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
-       e5 = G.addEdge(n4, n3);
-
-  // Check edge deletion
-  G.erase(e2);
-
-  checkGraphNodeList(G, 4);
-  checkGraphEdgeList(G, 4);
-  checkGraphArcList(G, 8);
-
-  checkGraphIncEdgeArcLists(G, n1, 2);
-  checkGraphIncEdgeArcLists(G, n2, 2);
-  checkGraphIncEdgeArcLists(G, n3, 2);
-  checkGraphIncEdgeArcLists(G, n4, 2);
-
-  checkGraphConEdgeList(G, 4);
-  checkGraphConArcList(G, 8);
-
-  // Check node deletion
-  G.erase(n3);
-
-  checkGraphNodeList(G, 3);
-  checkGraphEdgeList(G, 2);
-  checkGraphArcList(G, 4);
-
-  checkGraphIncEdgeArcLists(G, n1, 2);
-  checkGraphIncEdgeArcLists(G, n2, 1);
-  checkGraphIncEdgeArcLists(G, n4, 1);
-
-  checkGraphConEdgeList(G, 2);
-  checkGraphConArcList(G, 4);
-}
-
-
-template <class Graph>
-void checkGraphSnapshot() {
-  TEMPLATE_GRAPH_TYPEDEFS(Graph);
-
-  Graph G;
-  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
-  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
-       e3 = G.addEdge(n2, n3);
-
-  checkGraphNodeList(G, 3);
-  checkGraphEdgeList(G, 3);
-  checkGraphArcList(G, 6);
-
-  typename Graph::Snapshot snapshot(G);
-
-  Node n = G.addNode();
-  G.addEdge(n3, n);
-  G.addEdge(n, n3);
-  G.addEdge(n3, n2);
-
-  checkGraphNodeList(G, 4);
-  checkGraphEdgeList(G, 6);
-  checkGraphArcList(G, 12);
-
-  snapshot.restore();
-
-  checkGraphNodeList(G, 3);
-  checkGraphEdgeList(G, 3);
-  checkGraphArcList(G, 6);
-
-  checkGraphIncEdgeArcLists(G, n1, 2);
-  checkGraphIncEdgeArcLists(G, n2, 3);
-  checkGraphIncEdgeArcLists(G, n3, 1);
-
-  checkGraphConEdgeList(G, 3);
-  checkGraphConArcList(G, 6);
-
-  checkNodeIds(G);
-  checkEdgeIds(G);
-  checkArcIds(G);
-  checkGraphNodeMap(G);
-  checkGraphEdgeMap(G);
-  checkGraphArcMap(G);
-
-  G.addNode();
-  snapshot.save(G);
-
-  G.addEdge(G.addNode(), G.addNode());
-
-  snapshot.restore();
-
-  checkGraphNodeList(G, 4);
-  checkGraphEdgeList(G, 3);
-  checkGraphArcList(G, 6);
 }
 
@@ -401,13 +235,9 @@
 void checkGraphs() {
   { // Checking ListGraph
-    checkGraphBuild<ListGraph>();
-    checkGraphAlter<ListGraph>();
-    checkGraphErase<ListGraph>();
-    checkGraphSnapshot<ListGraph>();
+    checkGraph<ListGraph>();
     checkGraphValidityErase<ListGraph>();
   }
   { // Checking SmartGraph
-    checkGraphBuild<SmartGraph>();
-    checkGraphSnapshot<SmartGraph>();
+    checkGraph<SmartGraph>();
     checkGraphValidity<SmartGraph>();
   }
Index: test/graph_test.h
===================================================================
--- test/graph_test.h	(revision 387)
+++ test/graph_test.h	(revision 263)
@@ -115,13 +115,4 @@
     check(e==INVALID,"Wrong IncEdge list linking.");
     check(countIncEdges(G,n)==cnt,"Wrong IncEdge number.");
-  }
-
-  template <class Graph>
-  void checkGraphIncEdgeArcLists(const Graph &G, typename Graph::Node n,
-                                 int cnt)
-  {
-    checkGraphIncEdgeList(G, n, cnt);
-    checkGraphOutArcList(G, n, cnt);
-    checkGraphInArcList(G, n, cnt);
   }
 
Index: test/graph_utils_test.cc
===================================================================
--- test/graph_utils_test.cc	(revision 324)
+++ test/graph_utils_test.cc	(revision 220)
@@ -36,10 +36,9 @@
   {
     Digraph digraph;
-    typename Digraph::template NodeMap<int> nodes(digraph);
-    std::vector<Node> invNodes;
     for (int i = 0; i < 10; ++i) {
-      invNodes.push_back(digraph.addNode());
-      nodes[invNodes.back()]=invNodes.size()-1;
-    }
+      digraph.addNode();
+    }
+    DescriptorMap<Digraph, Node> nodes(digraph);
+    typename DescriptorMap<Digraph, Node>::InverseMap invNodes(nodes);
     for (int i = 0; i < 100; ++i) {
       int src = rnd[invNodes.size()];
@@ -48,4 +47,5 @@
     }
     typename Digraph::template ArcMap<bool> found(digraph, false);
+    DescriptorMap<Digraph, Arc> arcs(digraph);
     for (NodeIt src(digraph); src != INVALID; ++src) {
       for (NodeIt trg(digraph); trg != INVALID; ++trg) {
@@ -111,10 +111,9 @@
   TEMPLATE_GRAPH_TYPEDEFS(Graph);
   Graph graph;
-  typename Graph::template NodeMap<int> nodes(graph);
-  std::vector<Node> invNodes;
   for (int i = 0; i < 10; ++i) {
-    invNodes.push_back(graph.addNode());
-    nodes[invNodes.back()]=invNodes.size()-1;
-  }
+    graph.addNode();
+  }
+  DescriptorMap<Graph, Node> nodes(graph);
+  typename DescriptorMap<Graph, Node>::InverseMap invNodes(nodes);
   for (int i = 0; i < 100; ++i) {
     int src = rnd[invNodes.size()];
@@ -123,4 +122,5 @@
   }
   typename Graph::template EdgeMap<int> found(graph, 0);
+  DescriptorMap<Graph, Edge> edges(graph);
   for (NodeIt src(graph); src != INVALID; ++src) {
     for (NodeIt trg(graph); trg != INVALID; ++trg) {
Index: test/maps_test.cc
===================================================================
--- test/maps_test.cc	(revision 500)
+++ test/maps_test.cc	(revision 210)
@@ -171,5 +171,5 @@
     typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
     checkConcept<ReadMap<B,double>, CompMap>();
-    CompMap map1 = CompMap(DoubleMap(),ReadMap<B,A>());
+    CompMap map1(DoubleMap(),ReadMap<B,A>());
     CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
 
@@ -184,5 +184,5 @@
     typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
     checkConcept<ReadMap<A,double>, CombMap>();
-    CombMap map1 = CombMap(DoubleMap(), DoubleMap());
+    CombMap map1(DoubleMap(), DoubleMap());
     CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
 
@@ -196,9 +196,9 @@
     checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
     FunctorToMap<F> map1;
-    FunctorToMap<F> map2 = FunctorToMap<F>(F());
+    FunctorToMap<F> map2(F());
     B b = functorToMap(F())[A()];
 
     checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
-    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
+    MapToFunctor<ReadMap<A,B> > map(ReadMap<A,B>());
 
     check(functorToMap(&func)[A()] == 3,
