lemon/graph_utils.h
author deba
Tue, 25 Apr 2006 14:48:50 +0000
changeset 2064 2c5f81b35269
parent 2031 080d51024ac5
child 2094 3ae02034be53
permissions -rw-r--r--
Bug fix in findUEdge
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_GRAPH_UTILS_H
    20 #define LEMON_GRAPH_UTILS_H
    21 
    22 #include <iterator>
    23 #include <vector>
    24 #include <map>
    25 #include <cmath>
    26 
    27 #include <lemon/bits/invalid.h>
    28 #include <lemon/bits/utility.h>
    29 #include <lemon/maps.h>
    30 #include <lemon/bits/traits.h>
    31 
    32 #include <lemon/bits/alteration_notifier.h>
    33 #include <lemon/bits/default_map.h>
    34 
    35 ///\ingroup gutils
    36 ///\file
    37 ///\brief Graph utilities.
    38 ///
    39 ///
    40 
    41 
    42 namespace lemon {
    43 
    44   /// \addtogroup gutils
    45   /// @{
    46 
    47   ///Creates convenience typedefs for the graph types and iterators
    48 
    49   ///This \c \#define creates convenience typedefs for the following types
    50   ///of \c Graph: \c Node,  \c NodeIt, \c Edge, \c EdgeIt, \c InEdgeIt,
    51   ///\c OutEdgeIt
    52   ///\note If \c G it a template parameter, it should be used in this way.
    53   ///\code
    54   ///  GRAPH_TYPEDEFS(typename G)
    55   ///\endcode
    56   ///
    57   ///\warning There are no typedefs for the graph maps because of the lack of
    58   ///template typedefs in C++.
    59 #define GRAPH_TYPEDEFS(Graph)				\
    60   typedef Graph::     Node      Node;			\
    61     typedef Graph::   NodeIt    NodeIt;			\
    62     typedef Graph::   Edge      Edge;			\
    63     typedef Graph::   EdgeIt    EdgeIt;			\
    64     typedef Graph:: InEdgeIt  InEdgeIt;			\
    65     typedef Graph::OutEdgeIt OutEdgeIt;			
    66 
    67   ///Creates convenience typedefs for the undirected graph types and iterators
    68 
    69   ///This \c \#define creates the same convenience typedefs as defined by
    70   ///\ref GRAPH_TYPEDEFS(Graph) and three more, namely it creates
    71   ///\c UEdge, \c UEdgeIt, \c IncEdgeIt,
    72   ///
    73   ///\note If \c G it a template parameter, it should be used in this way.
    74   ///\code
    75   ///  UGRAPH_TYPEDEFS(typename G)
    76   ///\endcode
    77   ///
    78   ///\warning There are no typedefs for the graph maps because of the lack of
    79   ///template typedefs in C++.
    80 #define UGRAPH_TYPEDEFS(Graph)				\
    81   GRAPH_TYPEDEFS(Graph)						\
    82     typedef Graph:: UEdge   UEdge;			\
    83     typedef Graph:: UEdgeIt UEdgeIt;			\
    84     typedef Graph:: IncEdgeIt   IncEdgeIt;		       
    85 //     typedef Graph::template UEdgeMap<bool> BoolUEdgeMap;	 
    86 //     typedef Graph::template UEdgeMap<int> IntUEdgeMap;
    87 //     typedef Graph::template UEdgeMap<double> DoubleUEdgeMap;
    88 
    89   ///\brief Creates convenience typedefs for the bipartite undirected graph 
    90   ///types and iterators
    91 
    92   ///This \c \#define creates the same convenience typedefs as defined by
    93   ///\ref UGRAPH_TYPEDEFS(Graph) and two more, namely it creates
    94   ///\c ANodeIt, \c BNodeIt, 
    95   ///
    96   ///\note If \c G it a template parameter, it should be used in this way.
    97   ///\code
    98   ///  BPUGRAPH_TYPEDEFS(typename G)
    99   ///\endcode
   100   ///
   101   ///\warning There are no typedefs for the graph maps because of the lack of
   102   ///template typedefs in C++.
   103 #define BPUGRAPH_TYPEDEFS(Graph)            \
   104   UGRAPH_TYPEDEFS(Graph)                    \
   105     typedef Graph::ANodeIt ANodeIt;	    \
   106     typedef Graph::BNodeIt BNodeIt;
   107 
   108   /// \brief Function to count the items in the graph.
   109   ///
   110   /// This function counts the items (nodes, edges etc) in the graph.
   111   /// The complexity of the function is O(n) because
   112   /// it iterates on all of the items.
   113 
   114   template <typename Graph, typename Item>
   115   inline int countItems(const Graph& g) {
   116     typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
   117     int num = 0;
   118     for (ItemIt it(g); it != INVALID; ++it) {
   119       ++num;
   120     }
   121     return num;
   122   }
   123 
   124   // Node counting:
   125 
   126   namespace _graph_utils_bits {
   127     
   128     template <typename Graph, typename Enable = void>
   129     struct CountNodesSelector {
   130       static int count(const Graph &g) {
   131         return countItems<Graph, typename Graph::Node>(g);
   132       }
   133     };
   134 
   135     template <typename Graph>
   136     struct CountNodesSelector<
   137       Graph, typename 
   138       enable_if<typename Graph::NodeNumTag, void>::type> 
   139     {
   140       static int count(const Graph &g) {
   141         return g.nodeNum();
   142       }
   143     };    
   144   }
   145 
   146   /// \brief Function to count the nodes in the graph.
   147   ///
   148   /// This function counts the nodes in the graph.
   149   /// The complexity of the function is O(n) but for some
   150   /// graph structures it is specialized to run in O(1).
   151   ///
   152   /// \todo refer how to specialize it
   153 
   154   template <typename Graph>
   155   inline int countNodes(const Graph& g) {
   156     return _graph_utils_bits::CountNodesSelector<Graph>::count(g);
   157   }
   158 
   159   namespace _graph_utils_bits {
   160     
   161     template <typename Graph, typename Enable = void>
   162     struct CountANodesSelector {
   163       static int count(const Graph &g) {
   164         return countItems<Graph, typename Graph::ANode>(g);
   165       }
   166     };
   167 
   168     template <typename Graph>
   169     struct CountANodesSelector<
   170       Graph, typename 
   171       enable_if<typename Graph::NodeNumTag, void>::type> 
   172     {
   173       static int count(const Graph &g) {
   174         return g.nodeNum();
   175       }
   176     };    
   177   }
   178 
   179   /// \brief Function to count the anodes in the graph.
   180   ///
   181   /// This function counts the anodes in the graph.
   182   /// The complexity of the function is O(an) but for some
   183   /// graph structures it is specialized to run in O(1).
   184   ///
   185   /// \todo refer how to specialize it
   186 
   187   template <typename Graph>
   188   inline int countANodes(const Graph& g) {
   189     return _graph_utils_bits::CountANodesSelector<Graph>::count(g);
   190   }
   191 
   192   namespace _graph_utils_bits {
   193     
   194     template <typename Graph, typename Enable = void>
   195     struct CountBNodesSelector {
   196       static int count(const Graph &g) {
   197         return countItems<Graph, typename Graph::BNode>(g);
   198       }
   199     };
   200 
   201     template <typename Graph>
   202     struct CountBNodesSelector<
   203       Graph, typename 
   204       enable_if<typename Graph::NodeNumTag, void>::type> 
   205     {
   206       static int count(const Graph &g) {
   207         return g.nodeNum();
   208       }
   209     };    
   210   }
   211 
   212   /// \brief Function to count the bnodes in the graph.
   213   ///
   214   /// This function counts the bnodes in the graph.
   215   /// The complexity of the function is O(bn) but for some
   216   /// graph structures it is specialized to run in O(1).
   217   ///
   218   /// \todo refer how to specialize it
   219 
   220   template <typename Graph>
   221   inline int countBNodes(const Graph& g) {
   222     return _graph_utils_bits::CountBNodesSelector<Graph>::count(g);
   223   }
   224 
   225 
   226   // Edge counting:
   227 
   228   namespace _graph_utils_bits {
   229     
   230     template <typename Graph, typename Enable = void>
   231     struct CountEdgesSelector {
   232       static int count(const Graph &g) {
   233         return countItems<Graph, typename Graph::Edge>(g);
   234       }
   235     };
   236 
   237     template <typename Graph>
   238     struct CountEdgesSelector<
   239       Graph, 
   240       typename enable_if<typename Graph::EdgeNumTag, void>::type> 
   241     {
   242       static int count(const Graph &g) {
   243         return g.edgeNum();
   244       }
   245     };    
   246   }
   247 
   248   /// \brief Function to count the edges in the graph.
   249   ///
   250   /// This function counts the edges in the graph.
   251   /// The complexity of the function is O(e) but for some
   252   /// graph structures it is specialized to run in O(1).
   253 
   254   template <typename Graph>
   255   inline int countEdges(const Graph& g) {
   256     return _graph_utils_bits::CountEdgesSelector<Graph>::count(g);
   257   }
   258 
   259   // Undirected edge counting:
   260   namespace _graph_utils_bits {
   261     
   262     template <typename Graph, typename Enable = void>
   263     struct CountUEdgesSelector {
   264       static int count(const Graph &g) {
   265         return countItems<Graph, typename Graph::UEdge>(g);
   266       }
   267     };
   268 
   269     template <typename Graph>
   270     struct CountUEdgesSelector<
   271       Graph, 
   272       typename enable_if<typename Graph::EdgeNumTag, void>::type> 
   273     {
   274       static int count(const Graph &g) {
   275         return g.uEdgeNum();
   276       }
   277     };    
   278   }
   279 
   280   /// \brief Function to count the undirected edges in the graph.
   281   ///
   282   /// This function counts the undirected edges in the graph.
   283   /// The complexity of the function is O(e) but for some
   284   /// graph structures it is specialized to run in O(1).
   285 
   286   template <typename Graph>
   287   inline int countUEdges(const Graph& g) {
   288     return _graph_utils_bits::CountUEdgesSelector<Graph>::count(g);
   289 
   290   }
   291 
   292 
   293   template <typename Graph, typename DegIt>
   294   inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
   295     int num = 0;
   296     for (DegIt it(_g, _n); it != INVALID; ++it) {
   297       ++num;
   298     }
   299     return num;
   300   }
   301 
   302   /// \brief Function to count the number of the out-edges from node \c n.
   303   ///
   304   /// This function counts the number of the out-edges from node \c n
   305   /// in the graph.  
   306   template <typename Graph>
   307   inline int countOutEdges(const Graph& _g,  const typename Graph::Node& _n) {
   308     return countNodeDegree<Graph, typename Graph::OutEdgeIt>(_g, _n);
   309   }
   310 
   311   /// \brief Function to count the number of the in-edges to node \c n.
   312   ///
   313   /// This function counts the number of the in-edges to node \c n
   314   /// in the graph.  
   315   template <typename Graph>
   316   inline int countInEdges(const Graph& _g,  const typename Graph::Node& _n) {
   317     return countNodeDegree<Graph, typename Graph::InEdgeIt>(_g, _n);
   318   }
   319 
   320   /// \brief Function to count the number of the inc-edges to node \c n.
   321   ///
   322   /// This function counts the number of the inc-edges to node \c n
   323   /// in the graph.  
   324   template <typename Graph>
   325   inline int countIncEdges(const Graph& _g,  const typename Graph::Node& _n) {
   326     return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n);
   327   }
   328 
   329   namespace _graph_utils_bits {
   330     
   331     template <typename Graph, typename Enable = void>
   332     struct FindEdgeSelector {
   333       typedef typename Graph::Node Node;
   334       typedef typename Graph::Edge Edge;
   335       static Edge find(const Graph &g, Node u, Node v, Edge e) {
   336         if (e == INVALID) {
   337           g.firstOut(e, u);
   338         } else {
   339           g.nextOut(e);
   340         }
   341         while (e != INVALID && g.target(e) != v) {
   342           g.nextOut(e);
   343         }
   344         return e;
   345       }
   346     };
   347 
   348     template <typename Graph>
   349     struct FindEdgeSelector<
   350       Graph, 
   351       typename enable_if<typename Graph::FindEdgeTag, void>::type> 
   352     {
   353       typedef typename Graph::Node Node;
   354       typedef typename Graph::Edge Edge;
   355       static Edge find(const Graph &g, Node u, Node v, Edge prev) {
   356         return g.findEdge(u, v, prev);
   357       }
   358     };    
   359   }
   360 
   361   /// \brief Finds an edge between two nodes of a graph.
   362   ///
   363   /// Finds an edge from node \c u to node \c v in graph \c g.
   364   ///
   365   /// If \c prev is \ref INVALID (this is the default value), then
   366   /// it finds the first edge from \c u to \c v. Otherwise it looks for
   367   /// the next edge from \c u to \c v after \c prev.
   368   /// \return The found edge or \ref INVALID if there is no such an edge.
   369   ///
   370   /// Thus you can iterate through each edge from \c u to \c v as it follows.
   371   ///\code
   372   /// for(Edge e=findEdge(g,u,v);e!=INVALID;e=findEdge(g,u,v,e)) {
   373   ///   ...
   374   /// }
   375   ///\endcode
   376   template <typename Graph>
   377   inline typename Graph::Edge findEdge(const Graph &g,
   378 				       typename Graph::Node u, 
   379 				       typename Graph::Node v,
   380 				       typename Graph::Edge prev = INVALID) {
   381     return _graph_utils_bits::FindEdgeSelector<Graph>::find(g, u, v, prev);
   382   }
   383 
   384   /// \brief Iterator for iterating on edges connected the same nodes.
   385   ///
   386   /// Iterator for iterating on edges connected the same nodes. It is 
   387   /// higher level interface for the findEdge() function. You can
   388   /// use it the following way:
   389   ///\code
   390   /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
   391   ///   ...
   392   /// }
   393   ///\endcode
   394   ///
   395   /// \author Balazs Dezso 
   396   template <typename _Graph>
   397   class ConEdgeIt : public _Graph::Edge {
   398   public:
   399 
   400     typedef _Graph Graph;
   401     typedef typename Graph::Edge Parent;
   402 
   403     typedef typename Graph::Edge Edge;
   404     typedef typename Graph::Node Node;
   405 
   406     /// \brief Constructor.
   407     ///
   408     /// Construct a new ConEdgeIt iterating on the edges which
   409     /// connects the \c u and \c v node.
   410     ConEdgeIt(const Graph& g, Node u, Node v) : graph(g) {
   411       Parent::operator=(findEdge(graph, u, v));
   412     }
   413 
   414     /// \brief Constructor.
   415     ///
   416     /// Construct a new ConEdgeIt which continues the iterating from 
   417     /// the \c e edge.
   418     ConEdgeIt(const Graph& g, Edge e) : Parent(e), graph(g) {}
   419     
   420     /// \brief Increment operator.
   421     ///
   422     /// It increments the iterator and gives back the next edge.
   423     ConEdgeIt& operator++() {
   424       Parent::operator=(findEdge(graph, graph.source(*this), 
   425 				 graph.target(*this), *this));
   426       return *this;
   427     }
   428   private:
   429     const Graph& graph;
   430   };
   431 
   432   namespace _graph_utils_bits {
   433     
   434     template <typename Graph, typename Enable = void>
   435     struct FindUEdgeSelector {
   436       typedef typename Graph::Node Node;
   437       typedef typename Graph::UEdge UEdge;
   438       static UEdge find(const Graph &g, Node u, Node v, UEdge e) {
   439         bool b;
   440         if (u != v) {
   441           if (e == INVALID) {
   442             g.firstInc(e, b, u);
   443           } else {
   444             b = g.source(e) == u;
   445             g.nextInc(e, b);
   446           }
   447           while (e != INVALID && (b ? g.target(e) : g.source(e)) != v) {
   448             g.nextInc(e, b);
   449           }
   450         } else {
   451           if (e == INVALID) {
   452             g.firstInc(e, b, u);
   453           } else {
   454             b = true;
   455             g.nextInc(e, b);
   456           }
   457           while (e != INVALID && (!b || g.target(e) != v)) {
   458             g.nextInc(e, b);
   459           }
   460         }
   461         return e;
   462       }
   463     };
   464 
   465     template <typename Graph>
   466     struct FindUEdgeSelector<
   467       Graph, 
   468       typename enable_if<typename Graph::FindEdgeTag, void>::type> 
   469     {
   470       typedef typename Graph::Node Node;
   471       typedef typename Graph::UEdge UEdge;
   472       static UEdge find(const Graph &g, Node u, Node v, UEdge prev) {
   473         return g.findUEdge(u, v, prev);
   474       }
   475     };    
   476   }
   477 
   478   /// \brief Finds an uedge between two nodes of a graph.
   479   ///
   480   /// Finds an uedge from node \c u to node \c v in graph \c g.
   481   /// If the node \c u and node \c v is equal then each loop edge
   482   /// will be enumerated.
   483   ///
   484   /// If \c prev is \ref INVALID (this is the default value), then
   485   /// it finds the first edge from \c u to \c v. Otherwise it looks for
   486   /// the next edge from \c u to \c v after \c prev.
   487   /// \return The found edge or \ref INVALID if there is no such an edge.
   488   ///
   489   /// Thus you can iterate through each edge from \c u to \c v as it follows.
   490   ///\code
   491   /// for(UEdge e = findUEdge(g,u,v); e != INVALID; 
   492   ///     e = findUEdge(g,u,v,e)) {
   493   ///   ...
   494   /// }
   495   ///\endcode
   496   template <typename Graph>
   497   inline typename Graph::UEdge findUEdge(const Graph &g,
   498                                          typename Graph::Node u, 
   499                                          typename Graph::Node v,
   500                                          typename Graph::UEdge p = INVALID) {
   501     return _graph_utils_bits::FindUEdgeSelector<Graph>::find(g, u, v, p);
   502   }
   503 
   504   /// \brief Iterator for iterating on uedges connected the same nodes.
   505   ///
   506   /// Iterator for iterating on uedges connected the same nodes. It is 
   507   /// higher level interface for the findUEdge() function. You can
   508   /// use it the following way:
   509   ///\code
   510   /// for (ConUEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
   511   ///   ...
   512   /// }
   513   ///\endcode
   514   ///
   515   /// \author Balazs Dezso 
   516   template <typename _Graph>
   517   class ConUEdgeIt : public _Graph::UEdge {
   518   public:
   519 
   520     typedef _Graph Graph;
   521     typedef typename Graph::UEdge Parent;
   522 
   523     typedef typename Graph::UEdge UEdge;
   524     typedef typename Graph::Node Node;
   525 
   526     /// \brief Constructor.
   527     ///
   528     /// Construct a new ConUEdgeIt iterating on the edges which
   529     /// connects the \c u and \c v node.
   530     ConUEdgeIt(const Graph& g, Node u, Node v) : graph(g) {
   531       Parent::operator=(findUEdge(graph, u, v));
   532     }
   533 
   534     /// \brief Constructor.
   535     ///
   536     /// Construct a new ConUEdgeIt which continues the iterating from 
   537     /// the \c e edge.
   538     ConUEdgeIt(const Graph& g, UEdge e) : Parent(e), graph(g) {}
   539     
   540     /// \brief Increment operator.
   541     ///
   542     /// It increments the iterator and gives back the next edge.
   543     ConUEdgeIt& operator++() {
   544       Parent::operator=(findUEdge(graph, graph.source(*this), 
   545 				      graph.target(*this), *this));
   546       return *this;
   547     }
   548   private:
   549     const Graph& graph;
   550   };
   551 
   552   /// \brief Copy a map.
   553   ///
   554   /// This function copies the \c source map to the \c target map. It uses the
   555   /// given iterator to iterate on the data structure and it uses the \c ref
   556   /// mapping to convert the source's keys to the target's keys.
   557   template <typename Target, typename Source, 
   558 	    typename ItemIt, typename Ref>	    
   559   void copyMap(Target& target, const Source& source, 
   560 	       ItemIt it, const Ref& ref) {
   561     for (; it != INVALID; ++it) {
   562       target[ref[it]] = source[it];
   563     }
   564   }
   565 
   566   /// \brief Copy the source map to the target map.
   567   ///
   568   /// Copy the \c source map to the \c target map. It uses the given iterator
   569   /// to iterate on the data structure.
   570   template <typename Target, typename Source, typename ItemIt>	    
   571   void copyMap(Target& target, const Source& source, ItemIt it) {
   572     for (; it != INVALID; ++it) {
   573       target[it] = source[it];
   574     }
   575   }
   576 
   577   /// \brief Class to copy a graph.
   578   ///
   579   /// Class to copy a graph to another graph (duplicate a graph). The
   580   /// simplest way of using it is through the \c copyGraph() function.
   581   template <typename Target, typename Source>
   582   class GraphCopy {
   583   public: 
   584     typedef typename Source::Node Node;
   585     typedef typename Source::NodeIt NodeIt;
   586     typedef typename Source::Edge Edge;
   587     typedef typename Source::EdgeIt EdgeIt;
   588 
   589     typedef typename Source::template NodeMap<typename Target::Node>NodeRefMap;
   590     typedef typename Source::template EdgeMap<typename Target::Edge>EdgeRefMap;
   591 
   592     /// \brief Constructor for the GraphCopy.
   593     ///
   594     /// It copies the content of the \c _source graph into the
   595     /// \c _target graph. It creates also two references, one beetween
   596     /// the two nodeset and one beetween the two edgesets.
   597     GraphCopy(Target& _target, const Source& _source) 
   598       : source(_source), target(_target), 
   599 	nodeRefMap(_source), edgeRefMap(_source) {
   600       for (NodeIt it(source); it != INVALID; ++it) {
   601 	nodeRefMap[it] = target.addNode();
   602       }
   603       for (EdgeIt it(source); it != INVALID; ++it) {
   604 	edgeRefMap[it] = target.addEdge(nodeRefMap[source.source(it)], 
   605 					nodeRefMap[source.target(it)]);
   606       }
   607     }
   608 
   609     /// \brief Copies the node references into the given map.
   610     ///
   611     /// Copies the node references into the given map.
   612     template <typename NodeRef>
   613     const GraphCopy& nodeRef(NodeRef& map) const {
   614       for (NodeIt it(source); it != INVALID; ++it) {
   615 	map.set(it, nodeRefMap[it]);
   616       }
   617       return *this;
   618     }
   619 
   620     /// \brief Reverse and copies the node references into the given map.
   621     ///
   622     /// Reverse and copies the node references into the given map.
   623     template <typename NodeRef>
   624     const GraphCopy& nodeCrossRef(NodeRef& map) const {
   625       for (NodeIt it(source); it != INVALID; ++it) {
   626 	map.set(nodeRefMap[it], it);
   627       }
   628       return *this;
   629     }
   630 
   631     /// \brief Copies the edge references into the given map.
   632     ///
   633     /// Copies the edge references into the given map.
   634     template <typename EdgeRef>
   635     const GraphCopy& edgeRef(EdgeRef& map) const {
   636       for (EdgeIt it(source); it != INVALID; ++it) {
   637 	map.set(it, edgeRefMap[it]);
   638       }
   639       return *this;
   640     }
   641 
   642     /// \brief Reverse and copies the edge references into the given map.
   643     ///
   644     /// Reverse and copies the edge references into the given map.
   645     template <typename EdgeRef>
   646     const GraphCopy& edgeCrossRef(EdgeRef& map) const {
   647       for (EdgeIt it(source); it != INVALID; ++it) {
   648 	map.set(edgeRefMap[it], it);
   649       }
   650       return *this;
   651     }
   652 
   653     /// \brief Make copy of the given map.
   654     ///
   655     /// Makes copy of the given map for the newly created graph. 
   656     /// The new map's key type is the target graph's node type,
   657     /// and the copied map's key type is the source graph's node
   658     /// type.  
   659     template <typename TargetMap, typename SourceMap>
   660     const GraphCopy& nodeMap(TargetMap& tMap, const SourceMap& sMap) const {
   661       copyMap(tMap, sMap, NodeIt(source), nodeRefMap);
   662       return *this;
   663     }
   664 
   665     /// \brief Make copy of the given map.
   666     ///
   667     /// Makes copy of the given map for the newly created graph. 
   668     /// The new map's key type is the target graph's edge type,
   669     /// and the copied map's key type is the source graph's edge
   670     /// type.  
   671     template <typename TargetMap, typename SourceMap>
   672     const GraphCopy& edgeMap(TargetMap& tMap, const SourceMap& sMap) const {
   673       copyMap(tMap, sMap, EdgeIt(source), edgeRefMap);
   674       return *this;
   675     }
   676 
   677     /// \brief Gives back the stored node references.
   678     ///
   679     /// Gives back the stored node references.
   680     const NodeRefMap& nodeRef() const {
   681       return nodeRefMap;
   682     }
   683 
   684     /// \brief Gives back the stored edge references.
   685     ///
   686     /// Gives back the stored edge references.
   687     const EdgeRefMap& edgeRef() const {
   688       return edgeRefMap;
   689     }
   690 
   691     void run() const {}
   692 
   693   private:
   694     
   695     const Source& source;
   696     Target& target;
   697 
   698     NodeRefMap nodeRefMap;
   699     EdgeRefMap edgeRefMap;
   700   };
   701 
   702   /// \brief Copy a graph to another graph.
   703   ///
   704   /// Copy a graph to another graph.
   705   /// The usage of the function:
   706   /// 
   707   ///\code
   708   /// copyGraph(trg, src).nodeRef(nr).edgeCrossRef(ecr);
   709   ///\endcode
   710   /// 
   711   /// After the copy the \c nr map will contain the mapping from the
   712   /// source graph's nodes to the target graph's nodes and the \c ecr will
   713   /// contain the mapping from the target graph's edges to the source's
   714   /// edges.
   715   template <typename Target, typename Source>
   716   GraphCopy<Target, Source> copyGraph(Target& target, const Source& source) {
   717     return GraphCopy<Target, Source>(target, source);
   718   }
   719 
   720   /// \brief Class to copy an undirected graph.
   721   ///
   722   /// Class to copy an undirected graph to another graph (duplicate a graph).
   723   /// The simplest way of using it is through the \c copyUGraph() function.
   724   template <typename Target, typename Source>
   725   class UGraphCopy {
   726   public: 
   727     typedef typename Source::Node Node;
   728     typedef typename Source::NodeIt NodeIt;
   729     typedef typename Source::Edge Edge;
   730     typedef typename Source::EdgeIt EdgeIt;
   731     typedef typename Source::UEdge UEdge;
   732     typedef typename Source::UEdgeIt UEdgeIt;
   733 
   734     typedef typename Source::
   735     template NodeMap<typename Target::Node> NodeRefMap;
   736     
   737     typedef typename Source::
   738     template UEdgeMap<typename Target::UEdge> UEdgeRefMap;
   739 
   740   private:
   741 
   742     struct EdgeRefMap {
   743       EdgeRefMap(UGraphCopy& _gc) : gc(_gc) {}
   744       typedef typename Source::Edge Key;
   745       typedef typename Target::Edge Value;
   746 
   747       Value operator[](const Key& key) {
   748 	return gc.target.direct(gc.uEdgeRef[key], 
   749 				gc.target.direction(key));
   750       }
   751       
   752       UGraphCopy& gc;
   753     };
   754     
   755   public:
   756 
   757     /// \brief Constructor for the UGraphCopy.
   758     ///
   759     /// It copies the content of the \c _source graph into the
   760     /// \c _target graph. It creates also two references, one beetween
   761     /// the two nodeset and one beetween the two edgesets.
   762     UGraphCopy(Target& _target, const Source& _source) 
   763       : source(_source), target(_target), 
   764 	nodeRefMap(_source), edgeRefMap(*this), uEdgeRefMap(_source) {
   765       for (NodeIt it(source); it != INVALID; ++it) {
   766 	nodeRefMap[it] = target.addNode();
   767       }
   768       for (UEdgeIt it(source); it != INVALID; ++it) {
   769 	uEdgeRefMap[it] = target.addEdge(nodeRefMap[source.source(it)], 
   770 					nodeRefMap[source.target(it)]);
   771       }
   772     }
   773 
   774     /// \brief Copies the node references into the given map.
   775     ///
   776     /// Copies the node references into the given map.
   777     template <typename NodeRef>
   778     const UGraphCopy& nodeRef(NodeRef& map) const {
   779       for (NodeIt it(source); it != INVALID; ++it) {
   780 	map.set(it, nodeRefMap[it]);
   781       }
   782       return *this;
   783     }
   784 
   785     /// \brief Reverse and copies the node references into the given map.
   786     ///
   787     /// Reverse and copies the node references into the given map.
   788     template <typename NodeRef>
   789     const UGraphCopy& nodeCrossRef(NodeRef& map) const {
   790       for (NodeIt it(source); it != INVALID; ++it) {
   791 	map.set(nodeRefMap[it], it);
   792       }
   793       return *this;
   794     }
   795 
   796     /// \brief Copies the edge references into the given map.
   797     ///
   798     /// Copies the edge references into the given map.
   799     template <typename EdgeRef>
   800     const UGraphCopy& edgeRef(EdgeRef& map) const {
   801       for (EdgeIt it(source); it != INVALID; ++it) {
   802 	map.set(edgeRefMap[it], it);
   803       }
   804       return *this;
   805     }
   806 
   807     /// \brief Reverse and copies the undirected edge references into the 
   808     /// given map.
   809     ///
   810     /// Reverse and copies the undirected edge references into the given map.
   811     template <typename EdgeRef>
   812     const UGraphCopy& edgeCrossRef(EdgeRef& map) const {
   813       for (EdgeIt it(source); it != INVALID; ++it) {
   814 	map.set(it, edgeRefMap[it]);
   815       }
   816       return *this;
   817     }
   818 
   819     /// \brief Copies the undirected edge references into the given map.
   820     ///
   821     /// Copies the undirected edge references into the given map.
   822     template <typename EdgeRef>
   823     const UGraphCopy& uEdgeRef(EdgeRef& map) const {
   824       for (UEdgeIt it(source); it != INVALID; ++it) {
   825 	map.set(it, uEdgeRefMap[it]);
   826       }
   827       return *this;
   828     }
   829 
   830     /// \brief Reverse and copies the undirected edge references into the 
   831     /// given map.
   832     ///
   833     /// Reverse and copies the undirected edge references into the given map.
   834     template <typename EdgeRef>
   835     const UGraphCopy& uEdgeCrossRef(EdgeRef& map) const {
   836       for (UEdgeIt it(source); it != INVALID; ++it) {
   837 	map.set(uEdgeRefMap[it], it);
   838       }
   839       return *this;
   840     }
   841 
   842     /// \brief Make copy of the given map.
   843     ///
   844     /// Makes copy of the given map for the newly created graph. 
   845     /// The new map's key type is the target graph's node type,
   846     /// and the copied map's key type is the source graph's node
   847     /// type.  
   848     template <typename TargetMap, typename SourceMap>
   849     const UGraphCopy& nodeMap(TargetMap& tMap, 
   850 				  const SourceMap& sMap) const {
   851       copyMap(tMap, sMap, NodeIt(source), nodeRefMap);
   852       return *this;
   853     }
   854 
   855     /// \brief Make copy of the given map.
   856     ///
   857     /// Makes copy of the given map for the newly created graph. 
   858     /// The new map's key type is the target graph's edge type,
   859     /// and the copied map's key type is the source graph's edge
   860     /// type.  
   861     template <typename TargetMap, typename SourceMap>
   862     const UGraphCopy& edgeMap(TargetMap& tMap, 
   863 				  const SourceMap& sMap) const {
   864       copyMap(tMap, sMap, EdgeIt(source), edgeRefMap);
   865       return *this;
   866     }
   867 
   868     /// \brief Make copy of the given map.
   869     ///
   870     /// Makes copy of the given map for the newly created graph. 
   871     /// The new map's key type is the target graph's edge type,
   872     /// and the copied map's key type is the source graph's edge
   873     /// type.  
   874     template <typename TargetMap, typename SourceMap>
   875     const UGraphCopy& uEdgeMap(TargetMap& tMap, 
   876 				  const SourceMap& sMap) const {
   877       copyMap(tMap, sMap, UEdgeIt(source), uEdgeRefMap);
   878       return *this;
   879     }
   880 
   881     /// \brief Gives back the stored node references.
   882     ///
   883     /// Gives back the stored node references.
   884     const NodeRefMap& nodeRef() const {
   885       return nodeRefMap;
   886     }
   887 
   888     /// \brief Gives back the stored edge references.
   889     ///
   890     /// Gives back the stored edge references.
   891     const EdgeRefMap& edgeRef() const {
   892       return edgeRefMap;
   893     }
   894 
   895     /// \brief Gives back the stored uedge references.
   896     ///
   897     /// Gives back the stored uedge references.
   898     const UEdgeRefMap& uEdgeRef() const {
   899       return uEdgeRefMap;
   900     }
   901 
   902     void run() const {}
   903 
   904   private:
   905     
   906     const Source& source;
   907     Target& target;
   908 
   909     NodeRefMap nodeRefMap;
   910     EdgeRefMap edgeRefMap;
   911     UEdgeRefMap uEdgeRefMap;
   912   };
   913 
   914   /// \brief Copy a graph to another graph.
   915   ///
   916   /// Copy a graph to another graph.
   917   /// The usage of the function:
   918   /// 
   919   ///\code
   920   /// copyUGraph(trg, src).nodeRef(nr).edgeCrossRef(ecr);
   921   ///\endcode
   922   /// 
   923   /// After the copy the \c nr map will contain the mapping from the
   924   /// source graph's nodes to the target graph's nodes and the \c ecr will
   925   /// contain the mapping from the target graph's edges to the source's
   926   /// edges.
   927   template <typename Target, typename Source>
   928   UGraphCopy<Target, Source> 
   929   copyUGraph(Target& target, const Source& source) {
   930     return UGraphCopy<Target, Source>(target, source);
   931   }
   932 
   933 
   934   /// @}
   935 
   936   /// \addtogroup graph_maps
   937   /// @{
   938 
   939   /// Provides an immutable and unique id for each item in the graph.
   940 
   941   /// The IdMap class provides a unique and immutable id for each item of the
   942   /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
   943   /// different items (nodes) get different ids <li>\b immutable: the id of an
   944   /// item (node) does not change (even if you delete other nodes).  </ul>
   945   /// Through this map you get access (i.e. can read) the inner id values of
   946   /// the items stored in the graph. This map can be inverted with its member
   947   /// class \c InverseMap.
   948   ///
   949   template <typename _Graph, typename _Item>
   950   class IdMap {
   951   public:
   952     typedef _Graph Graph;
   953     typedef int Value;
   954     typedef _Item Item;
   955     typedef _Item Key;
   956 
   957     /// \brief Constructor.
   958     ///
   959     /// Constructor for creating id map.
   960     IdMap(const Graph& _graph) : graph(&_graph) {}
   961 
   962     /// \brief Gives back the \e id of the item.
   963     ///
   964     /// Gives back the immutable and unique \e id of the map.
   965     int operator[](const Item& item) const { return graph->id(item);}
   966 
   967 
   968   private:
   969     const Graph* graph;
   970 
   971   public:
   972 
   973     /// \brief The class represents the inverse of its owner (IdMap).
   974     ///
   975     /// The class represents the inverse of its owner (IdMap).
   976     /// \see inverse()
   977     class InverseMap {
   978     public:
   979 
   980       /// \brief Constructor.
   981       ///
   982       /// Constructor for creating an id-to-item map.
   983       InverseMap(const Graph& _graph) : graph(&_graph) {}
   984 
   985       /// \brief Constructor.
   986       ///
   987       /// Constructor for creating an id-to-item map.
   988       InverseMap(const IdMap& idMap) : graph(idMap.graph) {}
   989 
   990       /// \brief Gives back the given item from its id.
   991       ///
   992       /// Gives back the given item from its id.
   993       /// 
   994       Item operator[](int id) const { return graph->fromId(id, Item());}
   995     private:
   996       const Graph* graph;
   997     };
   998 
   999     /// \brief Gives back the inverse of the map.
  1000     ///
  1001     /// Gives back the inverse of the IdMap.
  1002     InverseMap inverse() const { return InverseMap(*graph);} 
  1003 
  1004   };
  1005 
  1006   
  1007   /// \brief General invertable graph-map type.
  1008 
  1009   /// This type provides simple invertable graph-maps. 
  1010   /// The InvertableMap wraps an arbitrary ReadWriteMap 
  1011   /// and if a key is set to a new value then store it
  1012   /// in the inverse map.
  1013   ///
  1014   /// The values of the map can be accessed
  1015   /// with stl compatible forward iterator.
  1016   ///
  1017   /// \param _Graph The graph type.
  1018   /// \param _Item The item type of the graph.
  1019   /// \param _Value The value type of the map.
  1020   ///
  1021   /// \see IterableValueMap
  1022 #ifndef DOXYGEN
  1023   /// \param _Map A ReadWriteMap mapping from the item type to integer.
  1024   template <
  1025     typename _Graph, typename _Item, typename _Value, 
  1026     typename _Map = DefaultMap<_Graph, _Item, _Value>
  1027   >
  1028 #else
  1029   template <typename _Graph, typename _Item, typename _Value>
  1030 #endif
  1031   class InvertableMap : protected _Map {
  1032   public:
  1033 
  1034     /// The key type of InvertableMap (Node, Edge, UEdge).
  1035     typedef typename _Map::Key Key;
  1036     /// The value type of the InvertableMap.
  1037     typedef typename _Map::Value Value;
  1038 
  1039   private:
  1040     
  1041     typedef _Map Map;
  1042     typedef _Graph Graph;
  1043 
  1044     typedef std::map<Value, Key> Container;
  1045     Container invMap;    
  1046 
  1047   public:
  1048  
  1049 
  1050 
  1051     /// \brief Constructor.
  1052     ///
  1053     /// Construct a new InvertableMap for the graph.
  1054     ///
  1055     InvertableMap(const Graph& graph) : Map(graph) {} 
  1056 
  1057     /// \brief Forward iterator for values.
  1058     ///
  1059     /// This iterator is an stl compatible forward
  1060     /// iterator on the values of the map. The values can
  1061     /// be accessed in the [beginValue, endValue) range.
  1062     ///
  1063     class ValueIterator 
  1064       : public std::iterator<std::forward_iterator_tag, Value> {
  1065       friend class InvertableMap;
  1066     private:
  1067       ValueIterator(typename Container::const_iterator _it) 
  1068         : it(_it) {}
  1069     public:
  1070       
  1071       ValueIterator() {}
  1072 
  1073       ValueIterator& operator++() { ++it; return *this; }
  1074       ValueIterator operator++(int) { 
  1075         ValueIterator tmp(*this); 
  1076         operator++();
  1077         return tmp; 
  1078       }
  1079 
  1080       const Value& operator*() const { return it->first; }
  1081       const Value* operator->() const { return &(it->first); }
  1082 
  1083       bool operator==(ValueIterator jt) const { return it == jt.it; }
  1084       bool operator!=(ValueIterator jt) const { return it != jt.it; }
  1085       
  1086     private:
  1087       typename Container::const_iterator it;
  1088     };
  1089 
  1090     /// \brief Returns an iterator to the first value.
  1091     ///
  1092     /// Returns an stl compatible iterator to the 
  1093     /// first value of the map. The values of the
  1094     /// map can be accessed in the [beginValue, endValue)
  1095     /// range.
  1096     ValueIterator beginValue() const {
  1097       return ValueIterator(invMap.begin());
  1098     }
  1099 
  1100     /// \brief Returns an iterator after the last value.
  1101     ///
  1102     /// Returns an stl compatible iterator after the 
  1103     /// last value of the map. The values of the
  1104     /// map can be accessed in the [beginValue, endValue)
  1105     /// range.
  1106     ValueIterator endValue() const {
  1107       return ValueIterator(invMap.end());
  1108     }
  1109     
  1110     /// \brief The setter function of the map.
  1111     ///
  1112     /// Sets the mapped value.
  1113     void set(const Key& key, const Value& val) {
  1114       Value oldval = Map::operator[](key);
  1115       typename Container::iterator it = invMap.find(oldval);
  1116       if (it != invMap.end() && it->second == key) {
  1117 	invMap.erase(it);
  1118       }      
  1119       invMap.insert(make_pair(val, key));
  1120       Map::set(key, val);
  1121     }
  1122 
  1123     /// \brief The getter function of the map.
  1124     ///
  1125     /// It gives back the value associated with the key.
  1126     typename MapTraits<Map>::ConstReturnValue 
  1127     operator[](const Key& key) const {
  1128       return Map::operator[](key);
  1129     }
  1130 
  1131   protected:
  1132 
  1133     /// \brief Erase the key from the map.
  1134     ///
  1135     /// Erase the key to the map. It is called by the
  1136     /// \c AlterationNotifier.
  1137     virtual void erase(const Key& key) {
  1138       Value val = Map::operator[](key);
  1139       typename Container::iterator it = invMap.find(val);
  1140       if (it != invMap.end() && it->second == key) {
  1141 	invMap.erase(it);
  1142       }
  1143       Map::erase(key);
  1144     }
  1145 
  1146     /// \brief Erase more keys from the map.
  1147     ///
  1148     /// Erase more keys from the map. It is called by the
  1149     /// \c AlterationNotifier.
  1150     virtual void erase(const std::vector<Key>& keys) {
  1151       for (int i = 0; i < (int)keys.size(); ++i) {
  1152 	Value val = Map::operator[](keys[i]);
  1153 	typename Container::iterator it = invMap.find(val);
  1154 	if (it != invMap.end() && it->second == keys[i]) {
  1155 	  invMap.erase(it);
  1156 	}
  1157       }
  1158       Map::erase(keys);
  1159     }
  1160 
  1161     /// \brief Clear the keys from the map and inverse map.
  1162     ///
  1163     /// Clear the keys from the map and inverse map. It is called by the
  1164     /// \c AlterationNotifier.
  1165     virtual void clear() {
  1166       invMap.clear();
  1167       Map::clear();
  1168     }
  1169 
  1170   public:
  1171 
  1172     /// \brief The inverse map type.
  1173     ///
  1174     /// The inverse of this map. The subscript operator of the map
  1175     /// gives back always the item what was last assigned to the value. 
  1176     class InverseMap {
  1177     public:
  1178       /// \brief Constructor of the InverseMap.
  1179       ///
  1180       /// Constructor of the InverseMap.
  1181       InverseMap(const InvertableMap& _inverted) : inverted(_inverted) {}
  1182 
  1183       /// The value type of the InverseMap.
  1184       typedef typename InvertableMap::Key Value;
  1185       /// The key type of the InverseMap.
  1186       typedef typename InvertableMap::Value Key; 
  1187 
  1188       /// \brief Subscript operator. 
  1189       ///
  1190       /// Subscript operator. It gives back always the item 
  1191       /// what was last assigned to the value.
  1192       Value operator[](const Key& key) const {
  1193 	typename Container::const_iterator it = inverted.invMap.find(key);
  1194 	return it->second;
  1195       }
  1196       
  1197     private:
  1198       const InvertableMap& inverted;
  1199     };
  1200 
  1201     /// \brief It gives back the just readeable inverse map.
  1202     ///
  1203     /// It gives back the just readeable inverse map.
  1204     InverseMap inverse() const {
  1205       return InverseMap(*this);
  1206     } 
  1207 
  1208 
  1209     
  1210   };
  1211 
  1212   /// \brief Provides a mutable, continuous and unique descriptor for each 
  1213   /// item in the graph.
  1214   ///
  1215   /// The DescriptorMap class provides a unique and continuous (but mutable)
  1216   /// descriptor (id) for each item of the same type (e.g. node) in the
  1217   /// graph. This id is <ul><li>\b unique: different items (nodes) get
  1218   /// different ids <li>\b continuous: the range of the ids is the set of
  1219   /// integers between 0 and \c n-1, where \c n is the number of the items of
  1220   /// this type (e.g. nodes) (so the id of a node can change if you delete an
  1221   /// other node, i.e. this id is mutable).  </ul> This map can be inverted
  1222   /// with its member class \c InverseMap.
  1223   ///
  1224   /// \param _Graph The graph class the \c DescriptorMap belongs to.
  1225   /// \param _Item The Item is the Key of the Map. It may be Node, Edge or 
  1226   /// UEdge.
  1227 #ifndef DOXYGEN
  1228   /// \param _Map A ReadWriteMap mapping from the item type to integer.
  1229   template <
  1230     typename _Graph, typename _Item,
  1231     typename _Map = DefaultMap<_Graph, _Item, int>
  1232   >
  1233 #else
  1234   template <typename _Graph, typename _Item>
  1235 #endif
  1236   class DescriptorMap : protected _Map {
  1237 
  1238     typedef _Item Item;
  1239     typedef _Map Map;
  1240 
  1241   public:
  1242     /// The graph class of DescriptorMap.
  1243     typedef _Graph Graph;
  1244 
  1245     /// The key type of DescriptorMap (Node, Edge, UEdge).
  1246     typedef typename _Map::Key Key;
  1247     /// The value type of DescriptorMap.
  1248     typedef typename _Map::Value Value;
  1249 
  1250     /// \brief Constructor.
  1251     ///
  1252     /// Constructor for descriptor map.
  1253     DescriptorMap(const Graph& _graph) : Map(_graph) {
  1254       build();
  1255     }
  1256 
  1257   protected:
  1258 
  1259     /// \brief Add a new key to the map.
  1260     ///
  1261     /// Add a new key to the map. It is called by the
  1262     /// \c AlterationNotifier.
  1263     virtual void add(const Item& item) {
  1264       Map::add(item);
  1265       Map::set(item, invMap.size());
  1266       invMap.push_back(item);
  1267     }
  1268 
  1269     /// \brief Add more new keys to the map.
  1270     ///
  1271     /// Add more new keys to the map. It is called by the
  1272     /// \c AlterationNotifier.
  1273     virtual void add(const std::vector<Item>& items) {
  1274       Map::add(items);
  1275       for (int i = 0; i < (int)items.size(); ++i) {
  1276 	Map::set(items[i], invMap.size());
  1277 	invMap.push_back(items[i]);
  1278       }
  1279     }
  1280 
  1281     /// \brief Erase the key from the map.
  1282     ///
  1283     /// Erase the key from the map. It is called by the
  1284     /// \c AlterationNotifier.
  1285     virtual void erase(const Item& item) {
  1286       Map::set(invMap.back(), Map::operator[](item));
  1287       invMap[Map::operator[](item)] = invMap.back();
  1288       invMap.pop_back();
  1289       Map::erase(item);
  1290     }
  1291 
  1292     /// \brief Erase more keys from the map.
  1293     ///
  1294     /// Erase more keys from the map. It is called by the
  1295     /// \c AlterationNotifier.
  1296     virtual void erase(const std::vector<Item>& items) {
  1297       for (int i = 0; i < (int)items.size(); ++i) {
  1298 	Map::set(invMap.back(), Map::operator[](items[i]));
  1299 	invMap[Map::operator[](items[i])] = invMap.back();
  1300 	invMap.pop_back();
  1301       }
  1302       Map::erase(items);
  1303     }
  1304 
  1305     /// \brief Build the unique map.
  1306     ///
  1307     /// Build the unique map. It is called by the
  1308     /// \c AlterationNotifier.
  1309     virtual void build() {
  1310       Map::build();
  1311       Item it;
  1312       const typename Map::Notifier* notifier = Map::getNotifier(); 
  1313       for (notifier->first(it); it != INVALID; notifier->next(it)) {
  1314 	Map::set(it, invMap.size());
  1315 	invMap.push_back(it);	
  1316       }      
  1317     }
  1318     
  1319     /// \brief Clear the keys from the map.
  1320     ///
  1321     /// Clear the keys from the map. It is called by the
  1322     /// \c AlterationNotifier.
  1323     virtual void clear() {
  1324       invMap.clear();
  1325       Map::clear();
  1326     }
  1327 
  1328   public:
  1329 
  1330     /// \brief Returns the maximal value plus one.
  1331     ///
  1332     /// Returns the maximal value plus one in the map.
  1333     unsigned int size() const {
  1334       return invMap.size();
  1335     }
  1336 
  1337     /// \brief Swaps the position of the two items in the map.
  1338     ///
  1339     /// Swaps the position of the two items in the map.
  1340     void swap(const Item& p, const Item& q) {
  1341       int pi = Map::operator[](p);
  1342       int qi = Map::operator[](q);
  1343       Map::set(p, qi);
  1344       invMap[qi] = p;
  1345       Map::set(q, pi);
  1346       invMap[pi] = q;
  1347     }
  1348 
  1349     /// \brief Gives back the \e descriptor of the item.
  1350     ///
  1351     /// Gives back the mutable and unique \e descriptor of the map.
  1352     int operator[](const Item& item) const {
  1353       return Map::operator[](item);
  1354     }
  1355     
  1356   private:
  1357 
  1358     typedef std::vector<Item> Container;
  1359     Container invMap;
  1360 
  1361   public:
  1362     /// \brief The inverse map type of DescriptorMap.
  1363     ///
  1364     /// The inverse map type of DescriptorMap.
  1365     class InverseMap {
  1366     public:
  1367       /// \brief Constructor of the InverseMap.
  1368       ///
  1369       /// Constructor of the InverseMap.
  1370       InverseMap(const DescriptorMap& _inverted) 
  1371 	: inverted(_inverted) {}
  1372 
  1373 
  1374       /// The value type of the InverseMap.
  1375       typedef typename DescriptorMap::Key Value;
  1376       /// The key type of the InverseMap.
  1377       typedef typename DescriptorMap::Value Key; 
  1378 
  1379       /// \brief Subscript operator. 
  1380       ///
  1381       /// Subscript operator. It gives back the item 
  1382       /// that the descriptor belongs to currently.
  1383       Value operator[](const Key& key) const {
  1384 	return inverted.invMap[key];
  1385       }
  1386 
  1387       /// \brief Size of the map.
  1388       ///
  1389       /// Returns the size of the map.
  1390       unsigned int size() const {
  1391 	return inverted.invMap.size();
  1392       }
  1393       
  1394     private:
  1395       const DescriptorMap& inverted;
  1396     };
  1397 
  1398     /// \brief Gives back the inverse of the map.
  1399     ///
  1400     /// Gives back the inverse of the map.
  1401     const InverseMap inverse() const {
  1402       return InverseMap(*this);
  1403     }
  1404   };
  1405 
  1406   /// \brief Returns the source of the given edge.
  1407   ///
  1408   /// The SourceMap gives back the source Node of the given edge. 
  1409   /// \author Balazs Dezso
  1410   template <typename Graph>
  1411   class SourceMap {
  1412   public:
  1413 
  1414     typedef typename Graph::Node Value;
  1415     typedef typename Graph::Edge Key;
  1416 
  1417     /// \brief Constructor
  1418     ///
  1419     /// Constructor
  1420     /// \param _graph The graph that the map belongs to.
  1421     SourceMap(const Graph& _graph) : graph(_graph) {}
  1422 
  1423     /// \brief The subscript operator.
  1424     ///
  1425     /// The subscript operator.
  1426     /// \param edge The edge 
  1427     /// \return The source of the edge 
  1428     Value operator[](const Key& edge) const {
  1429       return graph.source(edge);
  1430     }
  1431 
  1432   private:
  1433     const Graph& graph;
  1434   };
  1435 
  1436   /// \brief Returns a \ref SourceMap class
  1437   ///
  1438   /// This function just returns an \ref SourceMap class.
  1439   /// \relates SourceMap
  1440   template <typename Graph>
  1441   inline SourceMap<Graph> sourceMap(const Graph& graph) {
  1442     return SourceMap<Graph>(graph);
  1443   } 
  1444 
  1445   /// \brief Returns the target of the given edge.
  1446   ///
  1447   /// The TargetMap gives back the target Node of the given edge. 
  1448   /// \author Balazs Dezso
  1449   template <typename Graph>
  1450   class TargetMap {
  1451   public:
  1452 
  1453     typedef typename Graph::Node Value;
  1454     typedef typename Graph::Edge Key;
  1455 
  1456     /// \brief Constructor
  1457     ///
  1458     /// Constructor
  1459     /// \param _graph The graph that the map belongs to.
  1460     TargetMap(const Graph& _graph) : graph(_graph) {}
  1461 
  1462     /// \brief The subscript operator.
  1463     ///
  1464     /// The subscript operator.
  1465     /// \param e The edge 
  1466     /// \return The target of the edge 
  1467     Value operator[](const Key& e) const {
  1468       return graph.target(e);
  1469     }
  1470 
  1471   private:
  1472     const Graph& graph;
  1473   };
  1474 
  1475   /// \brief Returns a \ref TargetMap class
  1476   ///
  1477   /// This function just returns a \ref TargetMap class.
  1478   /// \relates TargetMap
  1479   template <typename Graph>
  1480   inline TargetMap<Graph> targetMap(const Graph& graph) {
  1481     return TargetMap<Graph>(graph);
  1482   }
  1483 
  1484   /// \brief Returns the "forward" directed edge view of an undirected edge.
  1485   ///
  1486   /// Returns the "forward" directed edge view of an undirected edge.
  1487   /// \author Balazs Dezso
  1488   template <typename Graph>
  1489   class ForwardMap {
  1490   public:
  1491 
  1492     typedef typename Graph::Edge Value;
  1493     typedef typename Graph::UEdge Key;
  1494 
  1495     /// \brief Constructor
  1496     ///
  1497     /// Constructor
  1498     /// \param _graph The graph that the map belongs to.
  1499     ForwardMap(const Graph& _graph) : graph(_graph) {}
  1500 
  1501     /// \brief The subscript operator.
  1502     ///
  1503     /// The subscript operator.
  1504     /// \param key An undirected edge 
  1505     /// \return The "forward" directed edge view of undirected edge 
  1506     Value operator[](const Key& key) const {
  1507       return graph.direct(key, true);
  1508     }
  1509 
  1510   private:
  1511     const Graph& graph;
  1512   };
  1513 
  1514   /// \brief Returns a \ref ForwardMap class
  1515   ///
  1516   /// This function just returns an \ref ForwardMap class.
  1517   /// \relates ForwardMap
  1518   template <typename Graph>
  1519   inline ForwardMap<Graph> forwardMap(const Graph& graph) {
  1520     return ForwardMap<Graph>(graph);
  1521   }
  1522 
  1523   /// \brief Returns the "backward" directed edge view of an undirected edge.
  1524   ///
  1525   /// Returns the "backward" directed edge view of an undirected edge.
  1526   /// \author Balazs Dezso
  1527   template <typename Graph>
  1528   class BackwardMap {
  1529   public:
  1530 
  1531     typedef typename Graph::Edge Value;
  1532     typedef typename Graph::UEdge Key;
  1533 
  1534     /// \brief Constructor
  1535     ///
  1536     /// Constructor
  1537     /// \param _graph The graph that the map belongs to.
  1538     BackwardMap(const Graph& _graph) : graph(_graph) {}
  1539 
  1540     /// \brief The subscript operator.
  1541     ///
  1542     /// The subscript operator.
  1543     /// \param key An undirected edge 
  1544     /// \return The "backward" directed edge view of undirected edge 
  1545     Value operator[](const Key& key) const {
  1546       return graph.direct(key, false);
  1547     }
  1548 
  1549   private:
  1550     const Graph& graph;
  1551   };
  1552 
  1553   /// \brief Returns a \ref BackwardMap class
  1554 
  1555   /// This function just returns a \ref BackwardMap class.
  1556   /// \relates BackwardMap
  1557   template <typename Graph>
  1558   inline BackwardMap<Graph> backwardMap(const Graph& graph) {
  1559     return BackwardMap<Graph>(graph);
  1560   }
  1561 
  1562   /// \brief Potential difference map
  1563   ///
  1564   /// If there is an potential map on the nodes then we
  1565   /// can get an edge map as we get the substraction of the
  1566   /// values of the target and source.
  1567   template <typename Graph, typename NodeMap>
  1568   class PotentialDifferenceMap {
  1569   public:
  1570     typedef typename Graph::Edge Key;
  1571     typedef typename NodeMap::Value Value;
  1572 
  1573     /// \brief Constructor
  1574     ///
  1575     /// Contructor of the map
  1576     PotentialDifferenceMap(const Graph& _graph, const NodeMap& _potential) 
  1577       : graph(_graph), potential(_potential) {}
  1578 
  1579     /// \brief Const subscription operator
  1580     ///
  1581     /// Const subscription operator
  1582     Value operator[](const Key& edge) const {
  1583       return potential[graph.target(edge)] - potential[graph.source(edge)];
  1584     }
  1585 
  1586   private:
  1587     const Graph& graph;
  1588     const NodeMap& potential;
  1589   };
  1590 
  1591   /// \brief Just returns a PotentialDifferenceMap
  1592   ///
  1593   /// Just returns a PotentialDifferenceMap
  1594   /// \relates PotentialDifferenceMap
  1595   template <typename Graph, typename NodeMap>
  1596   PotentialDifferenceMap<Graph, NodeMap> 
  1597   potentialDifferenceMap(const Graph& graph, const NodeMap& potential) {
  1598     return PotentialDifferenceMap<Graph, NodeMap>(graph, potential);
  1599   }
  1600 
  1601   /// \brief Map of the node in-degrees.
  1602   ///
  1603   /// This map returns the in-degree of a node. Once it is constructed,
  1604   /// the degrees are stored in a standard NodeMap, so each query is done
  1605   /// in constant time. On the other hand, the values are updated automatically
  1606   /// whenever the graph changes.
  1607   ///
  1608   /// \warning Besides addNode() and addEdge(), a graph structure may provide
  1609   /// alternative ways to modify the graph. The correct behavior of InDegMap
  1610   /// is not guarantied if these additional features are used. For example
  1611   /// the functions \ref ListGraph::changeSource() "changeSource()",
  1612   /// \ref ListGraph::changeTarget() "changeTarget()" and
  1613   /// \ref ListGraph::reverseEdge() "reverseEdge()"
  1614   /// of \ref ListGraph will \e not update the degree values correctly.
  1615   ///
  1616   /// \sa OutDegMap
  1617 
  1618   template <typename _Graph>
  1619   class InDegMap  
  1620     : protected ItemSetTraits<_Graph, typename _Graph::Edge>
  1621       ::ItemNotifier::ObserverBase {
  1622 
  1623   public:
  1624     
  1625     typedef _Graph Graph;
  1626     typedef int Value;
  1627     typedef typename Graph::Node Key;
  1628 
  1629     typedef typename ItemSetTraits<_Graph, typename _Graph::Edge>
  1630     ::ItemNotifier::ObserverBase Parent;
  1631 
  1632   private:
  1633 
  1634     class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
  1635     public:
  1636 
  1637       typedef DefaultMap<_Graph, Key, int> Parent;
  1638       typedef typename Parent::Graph Graph;
  1639 
  1640       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
  1641       
  1642       virtual void add(const Key& key) {
  1643 	Parent::add(key);
  1644 	Parent::set(key, 0);
  1645       }
  1646 
  1647       virtual void add(const std::vector<Key>& keys) {
  1648 	Parent::add(keys);
  1649 	for (int i = 0; i < (int)keys.size(); ++i) {
  1650 	  Parent::set(keys[i], 0);
  1651 	}
  1652       }
  1653     };
  1654 
  1655   public:
  1656 
  1657     /// \brief Constructor.
  1658     ///
  1659     /// Constructor for creating in-degree map.
  1660     InDegMap(const Graph& _graph) : graph(_graph), deg(_graph) {
  1661       Parent::attach(graph.getNotifier(typename _Graph::Edge()));
  1662       
  1663       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
  1664 	deg[it] = countInEdges(graph, it);
  1665       }
  1666     }
  1667     
  1668     /// Gives back the in-degree of a Node.
  1669     int operator[](const Key& key) const {
  1670       return deg[key];
  1671     }
  1672 
  1673   protected:
  1674     
  1675     typedef typename Graph::Edge Edge;
  1676 
  1677     virtual void add(const Edge& edge) {
  1678       ++deg[graph.target(edge)];
  1679     }
  1680 
  1681     virtual void add(const std::vector<Edge>& edges) {
  1682       for (int i = 0; i < (int)edges.size(); ++i) {
  1683         ++deg[graph.target(edges[i])];
  1684       }
  1685     }
  1686 
  1687     virtual void erase(const Edge& edge) {
  1688       --deg[graph.target(edge)];
  1689     }
  1690 
  1691     virtual void erase(const std::vector<Edge>& edges) {
  1692       for (int i = 0; i < (int)edges.size(); ++i) {
  1693         --deg[graph.target(edges[i])];
  1694       }
  1695     }
  1696 
  1697     virtual void build() {
  1698       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
  1699 	deg[it] = countInEdges(graph, it);
  1700       }      
  1701     }
  1702 
  1703     virtual void clear() {
  1704       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
  1705 	deg[it] = 0;
  1706       }
  1707     }
  1708   private:
  1709     
  1710     const _Graph& graph;
  1711     AutoNodeMap deg;
  1712   };
  1713 
  1714   /// \brief Map of the node out-degrees.
  1715   ///
  1716   /// This map returns the out-degree of a node. Once it is constructed,
  1717   /// the degrees are stored in a standard NodeMap, so each query is done
  1718   /// in constant time. On the other hand, the values are updated automatically
  1719   /// whenever the graph changes.
  1720   ///
  1721   /// \warning Besides addNode() and addEdge(), a graph structure may provide
  1722   /// alternative ways to modify the graph. The correct behavior of OutDegMap
  1723   /// is not guarantied if these additional features are used. For example
  1724   /// the functions \ref ListGraph::changeSource() "changeSource()",
  1725   /// \ref ListGraph::changeTarget() "changeTarget()" and
  1726   /// \ref ListGraph::reverseEdge() "reverseEdge()"
  1727   /// of \ref ListGraph will \e not update the degree values correctly.
  1728   ///
  1729   /// \sa InDegMap
  1730 
  1731   template <typename _Graph>
  1732   class OutDegMap  
  1733     : protected ItemSetTraits<_Graph, typename _Graph::Edge>
  1734       ::ItemNotifier::ObserverBase {
  1735 
  1736   public:
  1737 
  1738     typedef typename ItemSetTraits<_Graph, typename _Graph::Edge>
  1739     ::ItemNotifier::ObserverBase Parent;
  1740     
  1741     typedef _Graph Graph;
  1742     typedef int Value;
  1743     typedef typename Graph::Node Key;
  1744 
  1745   private:
  1746 
  1747     class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
  1748     public:
  1749 
  1750       typedef DefaultMap<_Graph, Key, int> Parent;
  1751       typedef typename Parent::Graph Graph;
  1752 
  1753       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
  1754       
  1755       virtual void add(const Key& key) {
  1756 	Parent::add(key);
  1757 	Parent::set(key, 0);
  1758       }
  1759       virtual void add(const std::vector<Key>& keys) {
  1760 	Parent::add(keys);
  1761 	for (int i = 0; i < (int)keys.size(); ++i) {
  1762 	  Parent::set(keys[i], 0);
  1763 	}
  1764       }
  1765     };
  1766 
  1767   public:
  1768 
  1769     /// \brief Constructor.
  1770     ///
  1771     /// Constructor for creating out-degree map.
  1772     OutDegMap(const Graph& _graph) : graph(_graph), deg(_graph) {
  1773       Parent::attach(graph.getNotifier(typename _Graph::Edge()));
  1774       
  1775       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
  1776 	deg[it] = countOutEdges(graph, it);
  1777       }
  1778     }
  1779 
  1780     /// Gives back the out-degree of a Node.
  1781     int operator[](const Key& key) const {
  1782       return deg[key];
  1783     }
  1784 
  1785   protected:
  1786     
  1787     typedef typename Graph::Edge Edge;
  1788 
  1789     virtual void add(const Edge& edge) {
  1790       ++deg[graph.source(edge)];
  1791     }
  1792 
  1793     virtual void add(const std::vector<Edge>& edges) {
  1794       for (int i = 0; i < (int)edges.size(); ++i) {
  1795         ++deg[graph.source(edges[i])];
  1796       }
  1797     }
  1798 
  1799     virtual void erase(const Edge& edge) {
  1800       --deg[graph.source(edge)];
  1801     }
  1802 
  1803     virtual void erase(const std::vector<Edge>& edges) {
  1804       for (int i = 0; i < (int)edges.size(); ++i) {
  1805         --deg[graph.source(edges[i])];
  1806       }
  1807     }
  1808 
  1809     virtual void build() {
  1810       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
  1811 	deg[it] = countOutEdges(graph, it);
  1812       }      
  1813     }
  1814 
  1815     virtual void clear() {
  1816       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
  1817 	deg[it] = 0;
  1818       }
  1819     }
  1820   private:
  1821     
  1822     const _Graph& graph;
  1823     AutoNodeMap deg;
  1824   };
  1825 
  1826 
  1827   /// @}
  1828 
  1829 } //END OF NAMESPACE LEMON
  1830 
  1831 #endif