| ... | ... | @@ -1893,70 +1893,73 @@
 | 
	| 1893 | 1893 |     };
 | 
	| 1894 | 1894 | 
 | 
	| 1895 | 1895 |     /// \brief Gives back the inverse of the map.
 | 
	| 1896 | 1896 |     ///
 | 
	| 1897 | 1897 |     /// Gives back the inverse of the IdMap.
 | 
	| 1898 | 1898 |     InverseMap inverse() const { return InverseMap(*_graph);}
 | 
	| 1899 | 1899 |   };
 | 
	| 1900 | 1900 | 
 | 
	| 1901 | 1901 | 
 | 
	| 1902 | 1902 |   /// \brief General cross reference graph map type.
 | 
	| 1903 | 1903 | 
 | 
	| 1904 | 1904 |   /// This class provides simple invertable graph maps.
 | 
	| 1905 |  |   /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
 | 
	| 1906 |  |   /// and if a key is set to a new value then store it
 | 
	| 1907 |  |   /// in the inverse map.
 | 
	| 1908 |  |   ///
 | 
	|  | 1905 |   /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
 | 
	|  | 1906 |   /// and if a key is set to a new value, then stores it in the inverse map.
 | 
	| 1909 | 1907 |   /// The values of the map can be accessed
 | 
	| 1910 | 1908 |   /// with stl compatible forward iterator.
 | 
	| 1911 | 1909 |   ///
 | 
	|  | 1910 |   /// This type is not reference map, so it cannot be modified with
 | 
	|  | 1911 |   /// the subscript operator.
 | 
	|  | 1912 |   ///
 | 
	| 1912 | 1913 |   /// \tparam GR The graph type.
 | 
	| 1913 | 1914 |   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
 | 
	| 1914 | 1915 |   /// \c GR::Edge).
 | 
	| 1915 | 1916 |   /// \tparam V The value type of the map.
 | 
	| 1916 | 1917 |   ///
 | 
	| 1917 | 1918 |   /// \see IterableValueMap
 | 
	| 1918 | 1919 |   template <typename GR, typename K, typename V>
 | 
	| 1919 | 1920 |   class CrossRefMap
 | 
	| 1920 | 1921 |     : protected ItemSetTraits<GR, K>::template Map<V>::Type {
 | 
	| 1921 | 1922 |   private:
 | 
	| 1922 | 1923 | 
 | 
	| 1923 | 1924 |     typedef typename ItemSetTraits<GR, K>::
 | 
	| 1924 | 1925 |       template Map<V>::Type Map;
 | 
	| 1925 | 1926 | 
 | 
	| 1926 |  |     typedef std::map<V, K> Container; | 
	|  | 1927 |     typedef std::multimap<V, K> Container;
 | 
	| 1927 | 1928 |     Container _inv_map;
 | 
	| 1928 | 1929 | 
 | 
	| 1929 | 1930 |   public:
 | 
	| 1930 | 1931 | 
 | 
	| 1931 | 1932 |     /// The graph type of CrossRefMap.
 | 
	| 1932 | 1933 |     typedef GR Graph;
 | 
	| 1933 | 1934 |     typedef GR Digraph;
 | 
	| 1934 | 1935 |     /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
 | 
	| 1935 | 1936 |     typedef K Item;
 | 
	| 1936 | 1937 |     /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
 | 
	| 1937 | 1938 |     typedef K Key;
 | 
	| 1938 | 1939 |     /// The value type of CrossRefMap.
 | 
	| 1939 | 1940 |     typedef V Value;
 | 
	| 1940 | 1941 | 
 | 
	| 1941 | 1942 |     /// \brief Constructor.
 | 
	| 1942 | 1943 |     ///
 | 
	| 1943 | 1944 |     /// Construct a new CrossRefMap for the given graph.
 | 
	| 1944 | 1945 |     explicit CrossRefMap(const Graph& graph) : Map(graph) {}
 | 
	| 1945 | 1946 | 
 | 
	| 1946 | 1947 |     /// \brief Forward iterator for values.
 | 
	| 1947 | 1948 |     ///
 | 
	| 1948 | 1949 |     /// This iterator is an stl compatible forward
 | 
	| 1949 | 1950 |     /// iterator on the values of the map. The values can
 | 
	| 1950 | 1951 |     /// be accessed in the <tt>[beginValue, endValue)</tt> range.
 | 
	|  | 1952 |     /// They are considered with multiplicity, so each value is
 | 
	|  | 1953 |     /// traversed for each item it is assigned to.
 | 
	| 1951 | 1954 |     class ValueIterator
 | 
	| 1952 | 1955 |       : public std::iterator<std::forward_iterator_tag, Value> {
 | 
	| 1953 | 1956 |       friend class CrossRefMap;
 | 
	| 1954 | 1957 |     private:
 | 
	| 1955 | 1958 |       ValueIterator(typename Container::const_iterator _it)
 | 
	| 1956 | 1959 |         : it(_it) {}
 | 
	| 1957 | 1960 |     public:
 | 
	| 1958 | 1961 | 
 | 
	| 1959 | 1962 |       ValueIterator() {}
 | 
	| 1960 | 1963 | 
 | 
	| 1961 | 1964 |       ValueIterator& operator++() { ++it; return *this; }
 | 
	| 1962 | 1965 |       ValueIterator operator++(int) {
 | 
	| ... | ... | @@ -1991,73 +1994,88 @@
 | 
	| 1991 | 1994 |     /// last value of the map. The values of the
 | 
	| 1992 | 1995 |     /// map can be accessed in the <tt>[beginValue, endValue)</tt>
 | 
	| 1993 | 1996 |     /// range.
 | 
	| 1994 | 1997 |     ValueIterator endValue() const {
 | 
	| 1995 | 1998 |       return ValueIterator(_inv_map.end());
 | 
	| 1996 | 1999 |     }
 | 
	| 1997 | 2000 | 
 | 
	| 1998 | 2001 |     /// \brief Sets the value associated with the given key.
 | 
	| 1999 | 2002 |     ///
 | 
	| 2000 | 2003 |     /// Sets the value associated with the given key.
 | 
	| 2001 | 2004 |     void set(const Key& key, const Value& val) {
 | 
	| 2002 | 2005 |       Value oldval = Map::operator[](key);
 | 
	| 2003 |  |       typename Container::iterator it = _inv_map.find(oldval);
 | 
	| 2004 |  |       if (it != _inv_map.end() && it->second == key) {
 | 
	| 2005 |  |        _inv_map.erase(it); | 
	|  | 2006 |       typename Container::iterator it;
 | 
	|  | 2007 |       for (it = _inv_map.equal_range(oldval).first;
 | 
	|  | 2008 |            it != _inv_map.equal_range(oldval).second; ++it) {
 | 
	|  | 2009 |         if (it->second == key) {
 | 
	|  | 2010 |           _inv_map.erase(it);
 | 
	|  | 2011 |           break;
 | 
	|  | 2012 |         }
 | 
	| 2006 | 2013 |       }
 | 
	| 2007 |  |       _inv_map.insert(make_pair(val, key));
 | 
	|  | 2014 |       _inv_map.insert(std::make_pair(val, key));
 | 
	| 2008 | 2015 |       Map::set(key, val);
 | 
	| 2009 | 2016 |     }
 | 
	| 2010 | 2017 | 
 | 
	| 2011 | 2018 |     /// \brief Returns the value associated with the given key.
 | 
	| 2012 | 2019 |     ///
 | 
	| 2013 | 2020 |     /// Returns the value associated with the given key.
 | 
	| 2014 | 2021 |     typename MapTraits<Map>::ConstReturnValue
 | 
	| 2015 | 2022 |     operator[](const Key& key) const {
 | 
	| 2016 | 2023 |       return Map::operator[](key);
 | 
	| 2017 | 2024 |     }
 | 
	| 2018 | 2025 | 
 | 
	| 2019 |  |     /// \brief Gives back theitem by its value. | 
	|  | 2026 |     /// \brief Gives back an item by its value.
 | 
	| 2020 | 2027 |     ///
 | 
	| 2021 |  |     /// Gives back the item by its value.
 | 
	| 2022 |  |     Key operator()(const Value& key) const {
 | 
	| 2023 |  |      typenameContainer::const_iteratorit=_inv_map.find(key); | 
	|  | 2028 |     /// This function gives back an item that is assigned to
 | 
	|  | 2029 |     /// the given value or \c INVALID if no such item exists.
 | 
	|  | 2030 |     /// If there are more items with the same associated value,
 | 
	|  | 2031 |     /// only one of them is returned.
 | 
	|  | 2032 |     Key operator()(const Value& val) const {
 | 
	|  | 2033 |       typename Container::const_iterator it = _inv_map.find(val);
 | 
	| 2024 | 2034 |       return it != _inv_map.end() ? it->second : INVALID;
 | 
	| 2025 | 2035 |     }
 | 
	| 2026 | 2036 | 
 | 
	| 2027 | 2037 |   protected:
 | 
	| 2028 | 2038 | 
 | 
	| 2029 | 2039 |     /// \brief Erase the key from the map and the inverse map.
 | 
	| 2030 | 2040 |     ///
 | 
	| 2031 | 2041 |     /// Erase the key from the map and the inverse map. It is called by the
 | 
	| 2032 | 2042 |     /// \c AlterationNotifier.
 | 
	| 2033 | 2043 |     virtual void erase(const Key& key) {
 | 
	| 2034 | 2044 |       Value val = Map::operator[](key);
 | 
	| 2035 |  |       typename Container::iterator it = _inv_map.find(val);
 | 
	| 2036 |  |       if (it != _inv_map.end() && it->second == key) {
 | 
	| 2037 |  |        _inv_map.erase(it); | 
	|  | 2045 |       typename Container::iterator it;
 | 
	|  | 2046 |       for (it = _inv_map.equal_range(val).first;
 | 
	|  | 2047 |            it != _inv_map.equal_range(val).second; ++it) {
 | 
	|  | 2048 |         if (it->second == key) {
 | 
	|  | 2049 |           _inv_map.erase(it);
 | 
	|  | 2050 |           break;
 | 
	|  | 2051 |         }
 | 
	| 2038 | 2052 |       }
 | 
	| 2039 | 2053 |       Map::erase(key);
 | 
	| 2040 | 2054 |     }
 | 
	| 2041 | 2055 | 
 | 
	| 2042 | 2056 |     /// \brief Erase more keys from the map and the inverse map.
 | 
	| 2043 | 2057 |     ///
 | 
	| 2044 | 2058 |     /// Erase more keys from the map and the inverse map. It is called by the
 | 
	| 2045 | 2059 |     /// \c AlterationNotifier.
 | 
	| 2046 | 2060 |     virtual void erase(const std::vector<Key>& keys) {
 | 
	| 2047 | 2061 |       for (int i = 0; i < int(keys.size()); ++i) {
 | 
	| 2048 | 2062 |         Value val = Map::operator[](keys[i]);
 | 
	| 2049 |  |         typename Container::iterator it = _inv_map.find(val);
 | 
	| 2050 |  |         if (it != _inv_map.end() && it->second == keys[i]) {
 | 
	| 2051 |  |          _inv_map.erase(it); | 
	|  | 2063 |         typename Container::iterator it;
 | 
	|  | 2064 |         for (it = _inv_map.equal_range(val).first;
 | 
	|  | 2065 |              it != _inv_map.equal_range(val).second; ++it) {
 | 
	|  | 2066 |           if (it->second == keys[i]) {
 | 
	|  | 2067 |             _inv_map.erase(it);
 | 
	|  | 2068 |             break;
 | 
	|  | 2069 |           }
 | 
	| 2052 | 2070 |         }
 | 
	| 2053 | 2071 |       }
 | 
	| 2054 | 2072 |       Map::erase(keys);
 | 
	| 2055 | 2073 |     }
 | 
	| 2056 | 2074 | 
 | 
	| 2057 | 2075 |     /// \brief Clear the keys from the map and the inverse map.
 | 
	| 2058 | 2076 |     ///
 | 
	| 2059 | 2077 |     /// Clear the keys from the map and the inverse map. It is called by the
 | 
	| 2060 | 2078 |     /// \c AlterationNotifier.
 | 
	| 2061 | 2079 |     virtual void clear() {
 | 
	| 2062 | 2080 |       _inv_map.clear();
 | 
	| 2063 | 2081 |       Map::clear();
 | 
	| ... | ... | @@ -2075,26 +2093,27 @@
 | 
	| 2075 | 2093 |       ///
 | 
	| 2076 | 2094 |       /// Constructor of the InverseMap.
 | 
	| 2077 | 2095 |       explicit InverseMap(const CrossRefMap& inverted)
 | 
	| 2078 | 2096 |         : _inverted(inverted) {}
 | 
	| 2079 | 2097 | 
 | 
	| 2080 | 2098 |       /// The value type of the InverseMap.
 | 
	| 2081 | 2099 |       typedef typename CrossRefMap::Key Value;
 | 
	| 2082 | 2100 |       /// The key type of the InverseMap.
 | 
	| 2083 | 2101 |       typedef typename CrossRefMap::Value Key;
 | 
	| 2084 | 2102 | 
 | 
	| 2085 | 2103 |       /// \brief Subscript operator.
 | 
	| 2086 | 2104 |       ///
 | 
	| 2087 |  |       /// Subscript operator. It gives back the item
 | 
	| 2088 |  |       /// that was last assigned to the given value.
 | 
	|  | 2105 |       /// Subscript operator. It gives back an item
 | 
	|  | 2106 |       /// that is assigned to the given value or \c INVALID
 | 
	|  | 2107 |       /// if no such item exists.
 | 
	| 2089 | 2108 |       Value operator[](const Key& key) const {
 | 
	| 2090 | 2109 |         return _inverted(key);
 | 
	| 2091 | 2110 |       }
 | 
	| 2092 | 2111 | 
 | 
	| 2093 | 2112 |     private:
 | 
	| 2094 | 2113 |       const CrossRefMap& _inverted;
 | 
	| 2095 | 2114 |     };
 | 
	| 2096 | 2115 | 
 | 
	| 2097 | 2116 |     /// \brief It gives back the read-only inverse map.
 | 
	| 2098 | 2117 |     ///
 | 
	| 2099 | 2118 |     /// It gives back the read-only inverse map.
 | 
	| 2100 | 2119 |     InverseMap inverse() const { |