klao@946: /* -*- C++ -*-
klao@946:  *
alpar@1956:  * This file is a part of LEMON, a generic C++ optimization library
alpar@1956:  *
alpar@1956:  * Copyright (C) 2003-2006
alpar@1956:  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@1359:  * (Egervary Research Group on Combinatorial Optimization, EGRES).
klao@946:  *
klao@946:  * Permission to use, modify and distribute this software is granted
klao@946:  * provided that this copyright notice appears in all copies. For
klao@946:  * precise terms see the accompanying LICENSE file.
klao@946:  *
klao@946:  * This software is provided "AS IS" with no warranty of any kind,
klao@946:  * express or implied, and with no claim as to its suitability for any
klao@946:  * purpose.
klao@946:  *
klao@946:  */
klao@946: 
klao@946: #ifndef LEMON_GRAPH_UTILS_H
klao@946: #define LEMON_GRAPH_UTILS_H
klao@946: 
klao@946: #include <iterator>
deba@1419: #include <vector>
alpar@1402: #include <map>
deba@1695: #include <cmath>
klao@946: 
deba@1993: #include <lemon/bits/invalid.h>
deba@1993: #include <lemon/bits/utility.h>
deba@1413: #include <lemon/maps.h>
deba@1993: #include <lemon/bits/traits.h>
deba@1990: 
alpar@1459: #include <lemon/bits/alteration_notifier.h>
deba@1990: #include <lemon/bits/default_map.h>
klao@946: 
alpar@947: ///\ingroup gutils
klao@946: ///\file
alpar@947: ///\brief Graph utilities.
klao@946: ///
alpar@964: ///
klao@946: 
klao@946: 
klao@946: namespace lemon {
klao@946: 
deba@1267:   /// \addtogroup gutils
deba@1267:   /// @{
alpar@947: 
alpar@1756:   ///Creates convenience typedefs for the graph types and iterators
alpar@1756: 
alpar@1756:   ///This \c \#define creates convenience typedefs for the following types
alpar@1756:   ///of \c Graph: \c Node,  \c NodeIt, \c Edge, \c EdgeIt, \c InEdgeIt,
deba@2031:   ///\c OutEdgeIt
alpar@1756:   ///\note If \c G it a template parameter, it should be used in this way.
alpar@1756:   ///\code
alpar@1756:   ///  GRAPH_TYPEDEFS(typename G)
alpar@1756:   ///\endcode
alpar@1756:   ///
alpar@1756:   ///\warning There are no typedefs for the graph maps because of the lack of
alpar@1756:   ///template typedefs in C++.
alpar@1804: #define GRAPH_TYPEDEFS(Graph)				\
alpar@1804:   typedef Graph::     Node      Node;			\
alpar@1804:     typedef Graph::   NodeIt    NodeIt;			\
alpar@1804:     typedef Graph::   Edge      Edge;			\
alpar@1804:     typedef Graph::   EdgeIt    EdgeIt;			\
alpar@1804:     typedef Graph:: InEdgeIt  InEdgeIt;			\
alpar@1811:     typedef Graph::OutEdgeIt OutEdgeIt;			
deba@2031: 
alpar@1756:   ///Creates convenience typedefs for the undirected graph types and iterators
alpar@1756: 
alpar@1756:   ///This \c \#define creates the same convenience typedefs as defined by
alpar@1756:   ///\ref GRAPH_TYPEDEFS(Graph) and three more, namely it creates
klao@1909:   ///\c UEdge, \c UEdgeIt, \c IncEdgeIt,
alpar@1756:   ///
alpar@1756:   ///\note If \c G it a template parameter, it should be used in this way.
alpar@1756:   ///\code
deba@1992:   ///  UGRAPH_TYPEDEFS(typename G)
alpar@1756:   ///\endcode
alpar@1756:   ///
alpar@1756:   ///\warning There are no typedefs for the graph maps because of the lack of
alpar@1756:   ///template typedefs in C++.
deba@1992: #define UGRAPH_TYPEDEFS(Graph)				\
alpar@1804:   GRAPH_TYPEDEFS(Graph)						\
klao@1909:     typedef Graph:: UEdge   UEdge;			\
klao@1909:     typedef Graph:: UEdgeIt UEdgeIt;			\
alpar@1811:     typedef Graph:: IncEdgeIt   IncEdgeIt;		       
klao@1909: //     typedef Graph::template UEdgeMap<bool> BoolUEdgeMap;	 
klao@1909: //     typedef Graph::template UEdgeMap<int> IntUEdgeMap;
klao@1909: //     typedef Graph::template UEdgeMap<double> DoubleUEdgeMap;
alpar@1756: 
deba@2031:   ///\brief Creates convenience typedefs for the bipartite undirected graph 
deba@2031:   ///types and iterators
deba@2031: 
deba@2031:   ///This \c \#define creates the same convenience typedefs as defined by
deba@2031:   ///\ref UGRAPH_TYPEDEFS(Graph) and two more, namely it creates
deba@2031:   ///\c ANodeIt, \c BNodeIt, 
deba@2031:   ///
deba@2031:   ///\note If \c G it a template parameter, it should be used in this way.
deba@2031:   ///\code
deba@2031:   ///  BPUGRAPH_TYPEDEFS(typename G)
deba@2031:   ///\endcode
deba@2031:   ///
deba@2031:   ///\warning There are no typedefs for the graph maps because of the lack of
deba@2031:   ///template typedefs in C++.
deba@2031: #define BPUGRAPH_TYPEDEFS(Graph)            \
deba@2031:   UGRAPH_TYPEDEFS(Graph)                    \
deba@2031:     typedef Graph::ANodeIt ANodeIt;	    \
deba@2031:     typedef Graph::BNodeIt BNodeIt;
alpar@1756: 
klao@946:   /// \brief Function to count the items in the graph.
klao@946:   ///
athos@1540:   /// This function counts the items (nodes, edges etc) in the graph.
klao@946:   /// The complexity of the function is O(n) because
klao@946:   /// it iterates on all of the items.
klao@946: 
deba@2020:   template <typename Graph, typename Item>
klao@977:   inline int countItems(const Graph& g) {
deba@2020:     typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
klao@946:     int num = 0;
klao@977:     for (ItemIt it(g); it != INVALID; ++it) {
klao@946:       ++num;
klao@946:     }
klao@946:     return num;
klao@946:   }
klao@946: 
klao@977:   // Node counting:
klao@977: 
deba@2020:   namespace _graph_utils_bits {
deba@2020:     
deba@2020:     template <typename Graph, typename Enable = void>
deba@2020:     struct CountNodesSelector {
deba@2020:       static int count(const Graph &g) {
deba@2020:         return countItems<Graph, typename Graph::Node>(g);
deba@2020:       }
deba@2020:     };
klao@977: 
deba@2020:     template <typename Graph>
deba@2020:     struct CountNodesSelector<
deba@2020:       Graph, typename 
deba@2020:       enable_if<typename Graph::NodeNumTag, void>::type> 
deba@2020:     {
deba@2020:       static int count(const Graph &g) {
deba@2020:         return g.nodeNum();
deba@2020:       }
deba@2020:     };    
klao@977:   }
klao@977: 
klao@946:   /// \brief Function to count the nodes in the graph.
klao@946:   ///
klao@946:   /// This function counts the nodes in the graph.
klao@946:   /// The complexity of the function is O(n) but for some
athos@1526:   /// graph structures it is specialized to run in O(1).
klao@977:   ///
klao@977:   /// \todo refer how to specialize it
klao@946: 
klao@946:   template <typename Graph>
klao@977:   inline int countNodes(const Graph& g) {
deba@2020:     return _graph_utils_bits::CountNodesSelector<Graph>::count(g);
klao@977:   }
klao@977: 
deba@2029:   namespace _graph_utils_bits {
deba@2029:     
deba@2029:     template <typename Graph, typename Enable = void>
deba@2029:     struct CountANodesSelector {
deba@2029:       static int count(const Graph &g) {
deba@2029:         return countItems<Graph, typename Graph::ANode>(g);
deba@2029:       }
deba@2029:     };
deba@2029: 
deba@2029:     template <typename Graph>
deba@2029:     struct CountANodesSelector<
deba@2029:       Graph, typename 
deba@2029:       enable_if<typename Graph::NodeNumTag, void>::type> 
deba@2029:     {
deba@2029:       static int count(const Graph &g) {
deba@2029:         return g.nodeNum();
deba@2029:       }
deba@2029:     };    
deba@2029:   }
deba@2029: 
deba@2029:   /// \brief Function to count the anodes in the graph.
deba@2029:   ///
deba@2029:   /// This function counts the anodes in the graph.
deba@2029:   /// The complexity of the function is O(an) but for some
deba@2029:   /// graph structures it is specialized to run in O(1).
deba@2029:   ///
deba@2029:   /// \todo refer how to specialize it
deba@2029: 
deba@2029:   template <typename Graph>
deba@2029:   inline int countANodes(const Graph& g) {
deba@2029:     return _graph_utils_bits::CountANodesSelector<Graph>::count(g);
deba@2029:   }
deba@2029: 
deba@2029:   namespace _graph_utils_bits {
deba@2029:     
deba@2029:     template <typename Graph, typename Enable = void>
deba@2029:     struct CountBNodesSelector {
deba@2029:       static int count(const Graph &g) {
deba@2029:         return countItems<Graph, typename Graph::BNode>(g);
deba@2029:       }
deba@2029:     };
deba@2029: 
deba@2029:     template <typename Graph>
deba@2029:     struct CountBNodesSelector<
deba@2029:       Graph, typename 
deba@2029:       enable_if<typename Graph::NodeNumTag, void>::type> 
deba@2029:     {
deba@2029:       static int count(const Graph &g) {
deba@2029:         return g.nodeNum();
deba@2029:       }
deba@2029:     };    
deba@2029:   }
deba@2029: 
deba@2029:   /// \brief Function to count the bnodes in the graph.
deba@2029:   ///
deba@2029:   /// This function counts the bnodes in the graph.
deba@2029:   /// The complexity of the function is O(bn) but for some
deba@2029:   /// graph structures it is specialized to run in O(1).
deba@2029:   ///
deba@2029:   /// \todo refer how to specialize it
deba@2029: 
deba@2029:   template <typename Graph>
deba@2029:   inline int countBNodes(const Graph& g) {
deba@2029:     return _graph_utils_bits::CountBNodesSelector<Graph>::count(g);
deba@2029:   }
deba@2029: 
deba@2020: 
klao@977:   // Edge counting:
klao@977: 
deba@2020:   namespace _graph_utils_bits {
deba@2020:     
deba@2020:     template <typename Graph, typename Enable = void>
deba@2020:     struct CountEdgesSelector {
deba@2020:       static int count(const Graph &g) {
deba@2020:         return countItems<Graph, typename Graph::Edge>(g);
deba@2020:       }
deba@2020:     };
klao@977: 
deba@2020:     template <typename Graph>
deba@2020:     struct CountEdgesSelector<
deba@2020:       Graph, 
deba@2020:       typename enable_if<typename Graph::EdgeNumTag, void>::type> 
deba@2020:     {
deba@2020:       static int count(const Graph &g) {
deba@2020:         return g.edgeNum();
deba@2020:       }
deba@2020:     };    
klao@946:   }
klao@946: 
klao@946:   /// \brief Function to count the edges in the graph.
klao@946:   ///
klao@946:   /// This function counts the edges in the graph.
klao@946:   /// The complexity of the function is O(e) but for some
athos@1526:   /// graph structures it is specialized to run in O(1).
klao@977: 
klao@946:   template <typename Graph>
klao@977:   inline int countEdges(const Graph& g) {
deba@2020:     return _graph_utils_bits::CountEdgesSelector<Graph>::count(g);
klao@946:   }
klao@946: 
klao@1053:   // Undirected edge counting:
deba@2020:   namespace _graph_utils_bits {
deba@2020:     
deba@2020:     template <typename Graph, typename Enable = void>
deba@2020:     struct CountUEdgesSelector {
deba@2020:       static int count(const Graph &g) {
deba@2020:         return countItems<Graph, typename Graph::UEdge>(g);
deba@2020:       }
deba@2020:     };
klao@1053: 
deba@2020:     template <typename Graph>
deba@2020:     struct CountUEdgesSelector<
deba@2020:       Graph, 
deba@2020:       typename enable_if<typename Graph::EdgeNumTag, void>::type> 
deba@2020:     {
deba@2020:       static int count(const Graph &g) {
deba@2020:         return g.uEdgeNum();
deba@2020:       }
deba@2020:     };    
klao@1053:   }
klao@1053: 
athos@1526:   /// \brief Function to count the undirected edges in the graph.
klao@946:   ///
athos@1526:   /// This function counts the undirected edges in the graph.
klao@946:   /// The complexity of the function is O(e) but for some
athos@1540:   /// graph structures it is specialized to run in O(1).
klao@1053: 
klao@946:   template <typename Graph>
klao@1909:   inline int countUEdges(const Graph& g) {
deba@2020:     return _graph_utils_bits::CountUEdgesSelector<Graph>::count(g);
deba@2020: 
klao@946:   }
klao@946: 
klao@977: 
klao@946:   template <typename Graph, typename DegIt>
klao@946:   inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
klao@946:     int num = 0;
klao@946:     for (DegIt it(_g, _n); it != INVALID; ++it) {
klao@946:       ++num;
klao@946:     }
klao@946:     return num;
klao@946:   }
alpar@967: 
deba@1531:   /// \brief Function to count the number of the out-edges from node \c n.
deba@1531:   ///
deba@1531:   /// This function counts the number of the out-edges from node \c n
deba@1531:   /// in the graph.  
deba@1531:   template <typename Graph>
deba@1531:   inline int countOutEdges(const Graph& _g,  const typename Graph::Node& _n) {
deba@1531:     return countNodeDegree<Graph, typename Graph::OutEdgeIt>(_g, _n);
deba@1531:   }
deba@1531: 
deba@1531:   /// \brief Function to count the number of the in-edges to node \c n.
deba@1531:   ///
deba@1531:   /// This function counts the number of the in-edges to node \c n
deba@1531:   /// in the graph.  
deba@1531:   template <typename Graph>
deba@1531:   inline int countInEdges(const Graph& _g,  const typename Graph::Node& _n) {
deba@1531:     return countNodeDegree<Graph, typename Graph::InEdgeIt>(_g, _n);
deba@1531:   }
deba@1531: 
deba@1704:   /// \brief Function to count the number of the inc-edges to node \c n.
deba@1679:   ///
deba@1704:   /// This function counts the number of the inc-edges to node \c n
deba@1679:   /// in the graph.  
deba@1679:   template <typename Graph>
deba@1679:   inline int countIncEdges(const Graph& _g,  const typename Graph::Node& _n) {
deba@1679:     return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n);
deba@1679:   }
deba@1679: 
deba@2020:   namespace _graph_utils_bits {
deba@2020:     
deba@2020:     template <typename Graph, typename Enable = void>
deba@2020:     struct FindEdgeSelector {
deba@2020:       typedef typename Graph::Node Node;
deba@2020:       typedef typename Graph::Edge Edge;
deba@2020:       static Edge find(const Graph &g, Node u, Node v, Edge e) {
deba@2020:         if (e == INVALID) {
deba@2020:           g.firstOut(e, u);
deba@2020:         } else {
deba@2020:           g.nextOut(e);
deba@2020:         }
deba@2020:         while (e != INVALID && g.target(e) != v) {
deba@2020:           g.nextOut(e);
deba@2020:         }
deba@2020:         return e;
deba@2020:       }
deba@2020:     };
deba@1531: 
deba@2020:     template <typename Graph>
deba@2020:     struct FindEdgeSelector<
deba@2020:       Graph, 
deba@2020:       typename enable_if<typename Graph::FindEdgeTag, void>::type> 
deba@2020:     {
deba@2020:       typedef typename Graph::Node Node;
deba@2020:       typedef typename Graph::Edge Edge;
deba@2020:       static Edge find(const Graph &g, Node u, Node v, Edge prev) {
deba@2020:         return g.findEdge(u, v, prev);
deba@2020:       }
deba@2020:     };    
deba@1565:   }
deba@1565: 
deba@1565:   /// \brief Finds an edge between two nodes of a graph.
deba@1565:   ///
alpar@967:   /// Finds an edge from node \c u to node \c v in graph \c g.
alpar@967:   ///
alpar@967:   /// If \c prev is \ref INVALID (this is the default value), then
alpar@967:   /// it finds the first edge from \c u to \c v. Otherwise it looks for
alpar@967:   /// the next edge from \c u to \c v after \c prev.
alpar@967:   /// \return The found edge or \ref INVALID if there is no such an edge.
alpar@967:   ///
alpar@967:   /// Thus you can iterate through each edge from \c u to \c v as it follows.
alpar@1946:   ///\code
alpar@967:   /// for(Edge e=findEdge(g,u,v);e!=INVALID;e=findEdge(g,u,v,e)) {
alpar@967:   ///   ...
alpar@967:   /// }
alpar@1946:   ///\endcode
alpar@967:   template <typename Graph>
deba@1565:   inline typename Graph::Edge findEdge(const Graph &g,
deba@1565: 				       typename Graph::Node u, 
deba@1565: 				       typename Graph::Node v,
deba@1565: 				       typename Graph::Edge prev = INVALID) {
deba@2020:     return _graph_utils_bits::FindEdgeSelector<Graph>::find(g, u, v, prev);
alpar@967:   }
deba@1531: 
deba@1565:   /// \brief Iterator for iterating on edges connected the same nodes.
deba@1565:   ///
deba@1565:   /// Iterator for iterating on edges connected the same nodes. It is 
deba@1565:   /// higher level interface for the findEdge() function. You can
alpar@1591:   /// use it the following way:
alpar@1946:   ///\code
deba@1565:   /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
deba@1565:   ///   ...
deba@1565:   /// }
alpar@1946:   ///\endcode
deba@1565:   ///
deba@1565:   /// \author Balazs Dezso 
deba@1565:   template <typename _Graph>
deba@1565:   class ConEdgeIt : public _Graph::Edge {
deba@1565:   public:
deba@1565: 
deba@1565:     typedef _Graph Graph;
deba@1565:     typedef typename Graph::Edge Parent;
deba@1565: 
deba@1565:     typedef typename Graph::Edge Edge;
deba@1565:     typedef typename Graph::Node Node;
deba@1565: 
deba@1565:     /// \brief Constructor.
deba@1565:     ///
deba@1565:     /// Construct a new ConEdgeIt iterating on the edges which
deba@1565:     /// connects the \c u and \c v node.
deba@1565:     ConEdgeIt(const Graph& g, Node u, Node v) : graph(g) {
deba@1565:       Parent::operator=(findEdge(graph, u, v));
deba@1565:     }
deba@1565: 
deba@1565:     /// \brief Constructor.
deba@1565:     ///
deba@1565:     /// Construct a new ConEdgeIt which continues the iterating from 
deba@1565:     /// the \c e edge.
deba@1565:     ConEdgeIt(const Graph& g, Edge e) : Parent(e), graph(g) {}
deba@1565:     
deba@1565:     /// \brief Increment operator.
deba@1565:     ///
deba@1565:     /// It increments the iterator and gives back the next edge.
deba@1565:     ConEdgeIt& operator++() {
deba@1565:       Parent::operator=(findEdge(graph, graph.source(*this), 
deba@1565: 				 graph.target(*this), *this));
deba@1565:       return *this;
deba@1565:     }
deba@1565:   private:
deba@1565:     const Graph& graph;
deba@1565:   };
deba@1565: 
deba@2020:   namespace _graph_utils_bits {
deba@2020:     
deba@2020:     template <typename Graph, typename Enable = void>
deba@2020:     struct FindUEdgeSelector {
deba@2020:       typedef typename Graph::Node Node;
deba@2020:       typedef typename Graph::UEdge UEdge;
deba@2020:       static UEdge find(const Graph &g, Node u, Node v, UEdge e) {
deba@2020:         bool b;
deba@2020:         if (u != v) {
deba@2020:           if (e == INVALID) {
deba@2031:             g.firstInc(e, b, u);
deba@2020:           } else {
deba@2020:             b = g.source(e) == u;
deba@2020:             g.nextInc(e, b);
deba@2020:           }
deba@2064:           while (e != INVALID && (b ? g.target(e) : g.source(e)) != v) {
deba@2020:             g.nextInc(e, b);
deba@2020:           }
deba@2020:         } else {
deba@2020:           if (e == INVALID) {
deba@2031:             g.firstInc(e, b, u);
deba@2020:           } else {
deba@2020:             b = true;
deba@2020:             g.nextInc(e, b);
deba@2020:           }
deba@2020:           while (e != INVALID && (!b || g.target(e) != v)) {
deba@2020:             g.nextInc(e, b);
deba@2020:           }
deba@2020:         }
deba@2020:         return e;
deba@2020:       }
deba@2020:     };
deba@1704: 
deba@2020:     template <typename Graph>
deba@2020:     struct FindUEdgeSelector<
deba@2020:       Graph, 
deba@2020:       typename enable_if<typename Graph::FindEdgeTag, void>::type> 
deba@2020:     {
deba@2020:       typedef typename Graph::Node Node;
deba@2020:       typedef typename Graph::UEdge UEdge;
deba@2020:       static UEdge find(const Graph &g, Node u, Node v, UEdge prev) {
deba@2020:         return g.findUEdge(u, v, prev);
deba@2020:       }
deba@2020:     };    
deba@1704:   }
deba@1704: 
klao@1909:   /// \brief Finds an uedge between two nodes of a graph.
deba@1704:   ///
klao@1909:   /// Finds an uedge from node \c u to node \c v in graph \c g.
deba@2020:   /// If the node \c u and node \c v is equal then each loop edge
deba@2020:   /// will be enumerated.
deba@1704:   ///
deba@1704:   /// If \c prev is \ref INVALID (this is the default value), then
deba@1704:   /// it finds the first edge from \c u to \c v. Otherwise it looks for
deba@1704:   /// the next edge from \c u to \c v after \c prev.
deba@1704:   /// \return The found edge or \ref INVALID if there is no such an edge.
deba@1704:   ///
deba@1704:   /// Thus you can iterate through each edge from \c u to \c v as it follows.
alpar@1946:   ///\code
klao@1909:   /// for(UEdge e = findUEdge(g,u,v); e != INVALID; 
klao@1909:   ///     e = findUEdge(g,u,v,e)) {
deba@1704:   ///   ...
deba@1704:   /// }
alpar@1946:   ///\endcode
deba@1704:   template <typename Graph>
deba@2031:   inline typename Graph::UEdge findUEdge(const Graph &g,
deba@2031:                                          typename Graph::Node u, 
deba@2031:                                          typename Graph::Node v,
deba@2031:                                          typename Graph::UEdge p = INVALID) {
deba@2031:     return _graph_utils_bits::FindUEdgeSelector<Graph>::find(g, u, v, p);
deba@1704:   }
deba@1704: 
klao@1909:   /// \brief Iterator for iterating on uedges connected the same nodes.
deba@1704:   ///
klao@1909:   /// Iterator for iterating on uedges connected the same nodes. It is 
klao@1909:   /// higher level interface for the findUEdge() function. You can
deba@1704:   /// use it the following way:
alpar@1946:   ///\code
klao@1909:   /// for (ConUEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
deba@1704:   ///   ...
deba@1704:   /// }
alpar@1946:   ///\endcode
deba@1704:   ///
deba@1704:   /// \author Balazs Dezso 
deba@1704:   template <typename _Graph>
klao@1909:   class ConUEdgeIt : public _Graph::UEdge {
deba@1704:   public:
deba@1704: 
deba@1704:     typedef _Graph Graph;
klao@1909:     typedef typename Graph::UEdge Parent;
deba@1704: 
klao@1909:     typedef typename Graph::UEdge UEdge;
deba@1704:     typedef typename Graph::Node Node;
deba@1704: 
deba@1704:     /// \brief Constructor.
deba@1704:     ///
klao@1909:     /// Construct a new ConUEdgeIt iterating on the edges which
deba@1704:     /// connects the \c u and \c v node.
klao@1909:     ConUEdgeIt(const Graph& g, Node u, Node v) : graph(g) {
klao@1909:       Parent::operator=(findUEdge(graph, u, v));
deba@1704:     }
deba@1704: 
deba@1704:     /// \brief Constructor.
deba@1704:     ///
klao@1909:     /// Construct a new ConUEdgeIt which continues the iterating from 
deba@1704:     /// the \c e edge.
klao@1909:     ConUEdgeIt(const Graph& g, UEdge e) : Parent(e), graph(g) {}
deba@1704:     
deba@1704:     /// \brief Increment operator.
deba@1704:     ///
deba@1704:     /// It increments the iterator and gives back the next edge.
klao@1909:     ConUEdgeIt& operator++() {
klao@1909:       Parent::operator=(findUEdge(graph, graph.source(*this), 
deba@1829: 				      graph.target(*this), *this));
deba@1704:       return *this;
deba@1704:     }
deba@1704:   private:
deba@1704:     const Graph& graph;
deba@1704:   };
deba@1704: 
athos@1540:   /// \brief Copy a map.
alpar@964:   ///
alpar@1547:   /// This function copies the \c source map to the \c target map. It uses the
athos@1540:   /// given iterator to iterate on the data structure and it uses the \c ref
athos@1540:   /// mapping to convert the source's keys to the target's keys.
deba@1531:   template <typename Target, typename Source, 
deba@1531: 	    typename ItemIt, typename Ref>	    
deba@1531:   void copyMap(Target& target, const Source& source, 
deba@1531: 	       ItemIt it, const Ref& ref) {
deba@1531:     for (; it != INVALID; ++it) {
deba@1531:       target[ref[it]] = source[it];
klao@946:     }
klao@946:   }
klao@946: 
deba@1531:   /// \brief Copy the source map to the target map.
deba@1531:   ///
deba@1531:   /// Copy the \c source map to the \c target map. It uses the given iterator
deba@1531:   /// to iterate on the data structure.
deba@1830:   template <typename Target, typename Source, typename ItemIt>	    
deba@1531:   void copyMap(Target& target, const Source& source, ItemIt it) {
deba@1531:     for (; it != INVALID; ++it) {
deba@1531:       target[it] = source[it];
klao@946:     }
klao@946:   }
klao@946: 
athos@1540:   /// \brief Class to copy a graph.
deba@1531:   ///
alpar@2006:   /// Class to copy a graph to another graph (duplicate a graph). The
athos@1540:   /// simplest way of using it is through the \c copyGraph() function.
deba@1531:   template <typename Target, typename Source>
deba@1267:   class GraphCopy {
deba@1531:   public: 
deba@1531:     typedef typename Source::Node Node;
deba@1531:     typedef typename Source::NodeIt NodeIt;
deba@1531:     typedef typename Source::Edge Edge;
deba@1531:     typedef typename Source::EdgeIt EdgeIt;
klao@946: 
deba@1531:     typedef typename Source::template NodeMap<typename Target::Node>NodeRefMap;
deba@1531:     typedef typename Source::template EdgeMap<typename Target::Edge>EdgeRefMap;
klao@946: 
deba@1531:     /// \brief Constructor for the GraphCopy.
deba@1531:     ///
deba@1531:     /// It copies the content of the \c _source graph into the
deba@1531:     /// \c _target graph. It creates also two references, one beetween
deba@1531:     /// the two nodeset and one beetween the two edgesets.
deba@1531:     GraphCopy(Target& _target, const Source& _source) 
deba@1531:       : source(_source), target(_target), 
deba@1531: 	nodeRefMap(_source), edgeRefMap(_source) {
deba@1531:       for (NodeIt it(source); it != INVALID; ++it) {
deba@1531: 	nodeRefMap[it] = target.addNode();
deba@1531:       }
deba@1531:       for (EdgeIt it(source); it != INVALID; ++it) {
deba@1531: 	edgeRefMap[it] = target.addEdge(nodeRefMap[source.source(it)], 
deba@1531: 					nodeRefMap[source.target(it)]);
deba@1531:       }
deba@1267:     }
klao@946: 
deba@1531:     /// \brief Copies the node references into the given map.
deba@1531:     ///
deba@1531:     /// Copies the node references into the given map.
deba@1531:     template <typename NodeRef>
deba@1531:     const GraphCopy& nodeRef(NodeRef& map) const {
deba@1531:       for (NodeIt it(source); it != INVALID; ++it) {
deba@1531: 	map.set(it, nodeRefMap[it]);
deba@1531:       }
deba@1531:       return *this;
deba@1267:     }
deba@1531: 
deba@1531:     /// \brief Reverse and copies the node references into the given map.
deba@1531:     ///
deba@1531:     /// Reverse and copies the node references into the given map.
deba@1531:     template <typename NodeRef>
deba@1531:     const GraphCopy& nodeCrossRef(NodeRef& map) const {
deba@1531:       for (NodeIt it(source); it != INVALID; ++it) {
deba@1531: 	map.set(nodeRefMap[it], it);
deba@1531:       }
deba@1531:       return *this;
deba@1531:     }
deba@1531: 
deba@1531:     /// \brief Copies the edge references into the given map.
deba@1531:     ///
deba@1531:     /// Copies the edge references into the given map.
deba@1531:     template <typename EdgeRef>
deba@1531:     const GraphCopy& edgeRef(EdgeRef& map) const {
deba@1531:       for (EdgeIt it(source); it != INVALID; ++it) {
deba@1531: 	map.set(it, edgeRefMap[it]);
deba@1531:       }
deba@1531:       return *this;
deba@1531:     }
deba@1531: 
deba@1531:     /// \brief Reverse and copies the edge references into the given map.
deba@1531:     ///
deba@1531:     /// Reverse and copies the edge references into the given map.
deba@1531:     template <typename EdgeRef>
deba@1531:     const GraphCopy& edgeCrossRef(EdgeRef& map) const {
deba@1531:       for (EdgeIt it(source); it != INVALID; ++it) {
deba@1531: 	map.set(edgeRefMap[it], it);
deba@1531:       }
deba@1531:       return *this;
deba@1531:     }
deba@1531: 
deba@1531:     /// \brief Make copy of the given map.
deba@1531:     ///
deba@1531:     /// Makes copy of the given map for the newly created graph. 
deba@1531:     /// The new map's key type is the target graph's node type,
deba@1531:     /// and the copied map's key type is the source graph's node
deba@1531:     /// type.  
deba@1531:     template <typename TargetMap, typename SourceMap>
deba@1531:     const GraphCopy& nodeMap(TargetMap& tMap, const SourceMap& sMap) const {
deba@1531:       copyMap(tMap, sMap, NodeIt(source), nodeRefMap);
deba@1531:       return *this;
deba@1531:     }
deba@1531: 
deba@1531:     /// \brief Make copy of the given map.
deba@1531:     ///
deba@1531:     /// Makes copy of the given map for the newly created graph. 
deba@1531:     /// The new map's key type is the target graph's edge type,
deba@1531:     /// and the copied map's key type is the source graph's edge
deba@1531:     /// type.  
deba@1531:     template <typename TargetMap, typename SourceMap>
deba@1531:     const GraphCopy& edgeMap(TargetMap& tMap, const SourceMap& sMap) const {
deba@1531:       copyMap(tMap, sMap, EdgeIt(source), edgeRefMap);
deba@1531:       return *this;
deba@1531:     }
deba@1531: 
deba@1531:     /// \brief Gives back the stored node references.
deba@1531:     ///
deba@1531:     /// Gives back the stored node references.
deba@1531:     const NodeRefMap& nodeRef() const {
deba@1531:       return nodeRefMap;
deba@1531:     }
deba@1531: 
deba@1531:     /// \brief Gives back the stored edge references.
deba@1531:     ///
deba@1531:     /// Gives back the stored edge references.
deba@1531:     const EdgeRefMap& edgeRef() const {
deba@1531:       return edgeRefMap;
deba@1531:     }
deba@1531: 
deba@1981:     void run() const {}
deba@1720: 
deba@1531:   private:
deba@1531:     
deba@1531:     const Source& source;
deba@1531:     Target& target;
deba@1531: 
deba@1531:     NodeRefMap nodeRefMap;
deba@1531:     EdgeRefMap edgeRefMap;
deba@1267:   };
klao@946: 
alpar@2006:   /// \brief Copy a graph to another graph.
deba@1531:   ///
alpar@2006:   /// Copy a graph to another graph.
deba@1531:   /// The usage of the function:
deba@1531:   /// 
alpar@1946:   ///\code
deba@1531:   /// copyGraph(trg, src).nodeRef(nr).edgeCrossRef(ecr);
alpar@1946:   ///\endcode
deba@1531:   /// 
deba@1531:   /// After the copy the \c nr map will contain the mapping from the
deba@1531:   /// source graph's nodes to the target graph's nodes and the \c ecr will
athos@1540:   /// contain the mapping from the target graph's edges to the source's
deba@1531:   /// edges.
deba@1531:   template <typename Target, typename Source>
deba@1531:   GraphCopy<Target, Source> copyGraph(Target& target, const Source& source) {
deba@1531:     return GraphCopy<Target, Source>(target, source);
deba@1531:   }
klao@946: 
deba@1720:   /// \brief Class to copy an undirected graph.
deba@1720:   ///
alpar@2006:   /// Class to copy an undirected graph to another graph (duplicate a graph).
klao@1909:   /// The simplest way of using it is through the \c copyUGraph() function.
deba@1720:   template <typename Target, typename Source>
klao@1909:   class UGraphCopy {
deba@1720:   public: 
deba@1720:     typedef typename Source::Node Node;
deba@1720:     typedef typename Source::NodeIt NodeIt;
deba@1720:     typedef typename Source::Edge Edge;
deba@1720:     typedef typename Source::EdgeIt EdgeIt;
klao@1909:     typedef typename Source::UEdge UEdge;
klao@1909:     typedef typename Source::UEdgeIt UEdgeIt;
deba@1720: 
deba@1720:     typedef typename Source::
deba@1720:     template NodeMap<typename Target::Node> NodeRefMap;
deba@1720:     
deba@1720:     typedef typename Source::
klao@1909:     template UEdgeMap<typename Target::UEdge> UEdgeRefMap;
deba@1720: 
deba@1720:   private:
deba@1720: 
deba@1720:     struct EdgeRefMap {
klao@1909:       EdgeRefMap(UGraphCopy& _gc) : gc(_gc) {}
deba@1720:       typedef typename Source::Edge Key;
deba@1720:       typedef typename Target::Edge Value;
deba@1720: 
deba@1720:       Value operator[](const Key& key) {
klao@1909: 	return gc.target.direct(gc.uEdgeRef[key], 
deba@1720: 				gc.target.direction(key));
deba@1720:       }
deba@1720:       
klao@1909:       UGraphCopy& gc;
deba@1720:     };
deba@1720:     
deba@1192:   public:
deba@1720: 
klao@1909:     /// \brief Constructor for the UGraphCopy.
deba@1720:     ///
deba@1720:     /// It copies the content of the \c _source graph into the
deba@1720:     /// \c _target graph. It creates also two references, one beetween
deba@1720:     /// the two nodeset and one beetween the two edgesets.
klao@1909:     UGraphCopy(Target& _target, const Source& _source) 
deba@1720:       : source(_source), target(_target), 
klao@1909: 	nodeRefMap(_source), edgeRefMap(*this), uEdgeRefMap(_source) {
deba@1720:       for (NodeIt it(source); it != INVALID; ++it) {
deba@1720: 	nodeRefMap[it] = target.addNode();
deba@1720:       }
klao@1909:       for (UEdgeIt it(source); it != INVALID; ++it) {
klao@1909: 	uEdgeRefMap[it] = target.addEdge(nodeRefMap[source.source(it)], 
deba@1720: 					nodeRefMap[source.target(it)]);
deba@1720:       }
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Copies the node references into the given map.
deba@1720:     ///
deba@1720:     /// Copies the node references into the given map.
deba@1720:     template <typename NodeRef>
klao@1909:     const UGraphCopy& nodeRef(NodeRef& map) const {
deba@1720:       for (NodeIt it(source); it != INVALID; ++it) {
deba@1720: 	map.set(it, nodeRefMap[it]);
deba@1720:       }
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Reverse and copies the node references into the given map.
deba@1720:     ///
deba@1720:     /// Reverse and copies the node references into the given map.
deba@1720:     template <typename NodeRef>
klao@1909:     const UGraphCopy& nodeCrossRef(NodeRef& map) const {
deba@1720:       for (NodeIt it(source); it != INVALID; ++it) {
deba@1720: 	map.set(nodeRefMap[it], it);
deba@1720:       }
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Copies the edge references into the given map.
deba@1720:     ///
deba@1720:     /// Copies the edge references into the given map.
deba@1720:     template <typename EdgeRef>
klao@1909:     const UGraphCopy& edgeRef(EdgeRef& map) const {
deba@1720:       for (EdgeIt it(source); it != INVALID; ++it) {
deba@1720: 	map.set(edgeRefMap[it], it);
deba@1720:       }
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Reverse and copies the undirected edge references into the 
deba@1720:     /// given map.
deba@1720:     ///
deba@1720:     /// Reverse and copies the undirected edge references into the given map.
deba@1720:     template <typename EdgeRef>
klao@1909:     const UGraphCopy& edgeCrossRef(EdgeRef& map) const {
deba@1720:       for (EdgeIt it(source); it != INVALID; ++it) {
deba@1720: 	map.set(it, edgeRefMap[it]);
deba@1720:       }
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Copies the undirected edge references into the given map.
deba@1720:     ///
deba@1720:     /// Copies the undirected edge references into the given map.
deba@1720:     template <typename EdgeRef>
klao@1909:     const UGraphCopy& uEdgeRef(EdgeRef& map) const {
klao@1909:       for (UEdgeIt it(source); it != INVALID; ++it) {
klao@1909: 	map.set(it, uEdgeRefMap[it]);
deba@1720:       }
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Reverse and copies the undirected edge references into the 
deba@1720:     /// given map.
deba@1720:     ///
deba@1720:     /// Reverse and copies the undirected edge references into the given map.
deba@1720:     template <typename EdgeRef>
klao@1909:     const UGraphCopy& uEdgeCrossRef(EdgeRef& map) const {
klao@1909:       for (UEdgeIt it(source); it != INVALID; ++it) {
klao@1909: 	map.set(uEdgeRefMap[it], it);
deba@1720:       }
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Make copy of the given map.
deba@1720:     ///
deba@1720:     /// Makes copy of the given map for the newly created graph. 
deba@1720:     /// The new map's key type is the target graph's node type,
deba@1720:     /// and the copied map's key type is the source graph's node
deba@1720:     /// type.  
deba@1720:     template <typename TargetMap, typename SourceMap>
klao@1909:     const UGraphCopy& nodeMap(TargetMap& tMap, 
deba@1720: 				  const SourceMap& sMap) const {
deba@1720:       copyMap(tMap, sMap, NodeIt(source), nodeRefMap);
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Make copy of the given map.
deba@1720:     ///
deba@1720:     /// Makes copy of the given map for the newly created graph. 
deba@1720:     /// The new map's key type is the target graph's edge type,
deba@1720:     /// and the copied map's key type is the source graph's edge
deba@1720:     /// type.  
deba@1720:     template <typename TargetMap, typename SourceMap>
klao@1909:     const UGraphCopy& edgeMap(TargetMap& tMap, 
deba@1720: 				  const SourceMap& sMap) const {
deba@1720:       copyMap(tMap, sMap, EdgeIt(source), edgeRefMap);
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Make copy of the given map.
deba@1720:     ///
deba@1720:     /// Makes copy of the given map for the newly created graph. 
deba@1720:     /// The new map's key type is the target graph's edge type,
deba@1720:     /// and the copied map's key type is the source graph's edge
deba@1720:     /// type.  
deba@1720:     template <typename TargetMap, typename SourceMap>
klao@1909:     const UGraphCopy& uEdgeMap(TargetMap& tMap, 
deba@1720: 				  const SourceMap& sMap) const {
klao@1909:       copyMap(tMap, sMap, UEdgeIt(source), uEdgeRefMap);
deba@1720:       return *this;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Gives back the stored node references.
deba@1720:     ///
deba@1720:     /// Gives back the stored node references.
deba@1720:     const NodeRefMap& nodeRef() const {
deba@1720:       return nodeRefMap;
deba@1720:     }
deba@1720: 
deba@1720:     /// \brief Gives back the stored edge references.
deba@1720:     ///
deba@1720:     /// Gives back the stored edge references.
deba@1720:     const EdgeRefMap& edgeRef() const {
deba@1720:       return edgeRefMap;
deba@1720:     }
deba@1720: 
klao@1909:     /// \brief Gives back the stored uedge references.
deba@1720:     ///
klao@1909:     /// Gives back the stored uedge references.
klao@1909:     const UEdgeRefMap& uEdgeRef() const {
klao@1909:       return uEdgeRefMap;
deba@1720:     }
deba@1720: 
deba@1981:     void run() const {}
deba@1720: 
deba@1720:   private:
deba@1192:     
deba@1720:     const Source& source;
deba@1720:     Target& target;
alpar@947: 
deba@1720:     NodeRefMap nodeRefMap;
deba@1720:     EdgeRefMap edgeRefMap;
klao@1909:     UEdgeRefMap uEdgeRefMap;
deba@1192:   };
deba@1192: 
alpar@2006:   /// \brief Copy a graph to another graph.
deba@1720:   ///
alpar@2006:   /// Copy a graph to another graph.
deba@1720:   /// The usage of the function:
deba@1720:   /// 
alpar@1946:   ///\code
alpar@2022:   /// copyUGraph(trg, src).nodeRef(nr).edgeCrossRef(ecr);
alpar@1946:   ///\endcode
deba@1720:   /// 
deba@1720:   /// After the copy the \c nr map will contain the mapping from the
deba@1720:   /// source graph's nodes to the target graph's nodes and the \c ecr will
deba@1720:   /// contain the mapping from the target graph's edges to the source's
deba@1720:   /// edges.
deba@1720:   template <typename Target, typename Source>
klao@1909:   UGraphCopy<Target, Source> 
klao@1909:   copyUGraph(Target& target, const Source& source) {
klao@1909:     return UGraphCopy<Target, Source>(target, source);
deba@1720:   }
deba@1192: 
deba@1192: 
deba@1192:   /// @}
alpar@1402: 
alpar@1402:   /// \addtogroup graph_maps
alpar@1402:   /// @{
alpar@1402: 
deba@1413:   /// Provides an immutable and unique id for each item in the graph.
deba@1413: 
athos@1540:   /// The IdMap class provides a unique and immutable id for each item of the
athos@1540:   /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
athos@1540:   /// different items (nodes) get different ids <li>\b immutable: the id of an
athos@1540:   /// item (node) does not change (even if you delete other nodes).  </ul>
athos@1540:   /// Through this map you get access (i.e. can read) the inner id values of
athos@1540:   /// the items stored in the graph. This map can be inverted with its member
athos@1540:   /// class \c InverseMap.
deba@1413:   ///
deba@1413:   template <typename _Graph, typename _Item>
deba@1413:   class IdMap {
deba@1413:   public:
deba@1413:     typedef _Graph Graph;
deba@1413:     typedef int Value;
deba@1413:     typedef _Item Item;
deba@1413:     typedef _Item Key;
deba@1413: 
deba@1413:     /// \brief Constructor.
deba@1413:     ///
deba@1413:     /// Constructor for creating id map.
deba@1413:     IdMap(const Graph& _graph) : graph(&_graph) {}
deba@1413: 
deba@1413:     /// \brief Gives back the \e id of the item.
deba@1413:     ///
deba@1413:     /// Gives back the immutable and unique \e id of the map.
deba@1413:     int operator[](const Item& item) const { return graph->id(item);}
deba@1413: 
deba@1413: 
deba@1413:   private:
deba@1413:     const Graph* graph;
deba@1413: 
deba@1413:   public:
deba@1413: 
athos@1540:     /// \brief The class represents the inverse of its owner (IdMap).
deba@1413:     ///
athos@1540:     /// The class represents the inverse of its owner (IdMap).
deba@1413:     /// \see inverse()
deba@1413:     class InverseMap {
deba@1413:     public:
deba@1419: 
deba@1413:       /// \brief Constructor.
deba@1413:       ///
deba@1413:       /// Constructor for creating an id-to-item map.
deba@1413:       InverseMap(const Graph& _graph) : graph(&_graph) {}
deba@1413: 
deba@1413:       /// \brief Constructor.
deba@1413:       ///
deba@1413:       /// Constructor for creating an id-to-item map.
deba@1413:       InverseMap(const IdMap& idMap) : graph(idMap.graph) {}
deba@1413: 
deba@1413:       /// \brief Gives back the given item from its id.
deba@1413:       ///
deba@1413:       /// Gives back the given item from its id.
deba@1413:       /// 
deba@1413:       Item operator[](int id) const { return graph->fromId(id, Item());}
deba@1413:     private:
deba@1413:       const Graph* graph;
deba@1413:     };
deba@1413: 
deba@1413:     /// \brief Gives back the inverse of the map.
deba@1413:     ///
athos@1540:     /// Gives back the inverse of the IdMap.
deba@1413:     InverseMap inverse() const { return InverseMap(*graph);} 
deba@1413: 
deba@1413:   };
deba@1413: 
deba@1413:   
athos@1526:   /// \brief General invertable graph-map type.
alpar@1402: 
athos@1540:   /// This type provides simple invertable graph-maps. 
athos@1526:   /// The InvertableMap wraps an arbitrary ReadWriteMap 
athos@1526:   /// and if a key is set to a new value then store it
alpar@1402:   /// in the inverse map.
deba@1931:   ///
deba@1931:   /// The values of the map can be accessed
deba@1931:   /// with stl compatible forward iterator.
deba@1931:   ///
alpar@1402:   /// \param _Graph The graph type.
deba@1830:   /// \param _Item The item type of the graph.
deba@1830:   /// \param _Value The value type of the map.
deba@1931:   ///
deba@1931:   /// \see IterableValueMap
deba@1830: #ifndef DOXYGEN
deba@1830:   /// \param _Map A ReadWriteMap mapping from the item type to integer.
alpar@1402:   template <
deba@1990:     typename _Graph, typename _Item, typename _Value, 
deba@1990:     typename _Map = DefaultMap<_Graph, _Item, _Value>
alpar@1402:   >
deba@1830: #else
deba@1830:   template <typename _Graph, typename _Item, typename _Value>
deba@1830: #endif
deba@1413:   class InvertableMap : protected _Map {
alpar@1402:   public:
deba@1413: 
klao@1909:     /// The key type of InvertableMap (Node, Edge, UEdge).
alpar@1402:     typedef typename _Map::Key Key;
deba@1413:     /// The value type of the InvertableMap.
alpar@1402:     typedef typename _Map::Value Value;
alpar@1402: 
deba@1931:   private:
deba@1931:     
deba@1931:     typedef _Map Map;
deba@1931:     typedef _Graph Graph;
deba@1931: 
deba@1931:     typedef std::map<Value, Key> Container;
deba@1931:     Container invMap;    
deba@1931: 
deba@1931:   public:
deba@1931:  
deba@1931: 
deba@1931: 
alpar@1402:     /// \brief Constructor.
alpar@1402:     ///
deba@1413:     /// Construct a new InvertableMap for the graph.
alpar@1402:     ///
deba@1413:     InvertableMap(const Graph& graph) : Map(graph) {} 
deba@1931: 
deba@1931:     /// \brief Forward iterator for values.
deba@1931:     ///
deba@1931:     /// This iterator is an stl compatible forward
deba@1931:     /// iterator on the values of the map. The values can
deba@1931:     /// be accessed in the [beginValue, endValue) range.
deba@1931:     ///
deba@1931:     class ValueIterator 
deba@1931:       : public std::iterator<std::forward_iterator_tag, Value> {
deba@1931:       friend class InvertableMap;
deba@1931:     private:
deba@1931:       ValueIterator(typename Container::const_iterator _it) 
deba@1931:         : it(_it) {}
deba@1931:     public:
deba@1931:       
deba@1931:       ValueIterator() {}
deba@1931: 
deba@1931:       ValueIterator& operator++() { ++it; return *this; }
deba@1931:       ValueIterator operator++(int) { 
deba@1931:         ValueIterator tmp(*this); 
deba@1931:         operator++();
deba@1931:         return tmp; 
deba@1931:       }
deba@1931: 
deba@1931:       const Value& operator*() const { return it->first; }
deba@1931:       const Value* operator->() const { return &(it->first); }
deba@1931: 
deba@1931:       bool operator==(ValueIterator jt) const { return it == jt.it; }
deba@1931:       bool operator!=(ValueIterator jt) const { return it != jt.it; }
deba@1931:       
deba@1931:     private:
deba@1931:       typename Container::const_iterator it;
deba@1931:     };
deba@1931: 
deba@1931:     /// \brief Returns an iterator to the first value.
deba@1931:     ///
deba@1931:     /// Returns an stl compatible iterator to the 
deba@1931:     /// first value of the map. The values of the
deba@1931:     /// map can be accessed in the [beginValue, endValue)
deba@1931:     /// range.
deba@1931:     ValueIterator beginValue() const {
deba@1931:       return ValueIterator(invMap.begin());
deba@1931:     }
deba@1931: 
deba@1931:     /// \brief Returns an iterator after the last value.
deba@1931:     ///
deba@1931:     /// Returns an stl compatible iterator after the 
deba@1931:     /// last value of the map. The values of the
deba@1931:     /// map can be accessed in the [beginValue, endValue)
deba@1931:     /// range.
deba@1931:     ValueIterator endValue() const {
deba@1931:       return ValueIterator(invMap.end());
deba@1931:     }
alpar@1402:     
alpar@1402:     /// \brief The setter function of the map.
alpar@1402:     ///
deba@1413:     /// Sets the mapped value.
alpar@1402:     void set(const Key& key, const Value& val) {
alpar@1402:       Value oldval = Map::operator[](key);
deba@1413:       typename Container::iterator it = invMap.find(oldval);
alpar@1402:       if (it != invMap.end() && it->second == key) {
alpar@1402: 	invMap.erase(it);
alpar@1402:       }      
alpar@1402:       invMap.insert(make_pair(val, key));
alpar@1402:       Map::set(key, val);
alpar@1402:     }
alpar@1402: 
alpar@1402:     /// \brief The getter function of the map.
alpar@1402:     ///
alpar@1402:     /// It gives back the value associated with the key.
deba@1931:     typename MapTraits<Map>::ConstReturnValue 
deba@1931:     operator[](const Key& key) const {
alpar@1402:       return Map::operator[](key);
alpar@1402:     }
alpar@1402: 
deba@1515:   protected:
deba@1515: 
alpar@1402:     /// \brief Erase the key from the map.
alpar@1402:     ///
alpar@1402:     /// Erase the key to the map. It is called by the
alpar@1402:     /// \c AlterationNotifier.
alpar@1402:     virtual void erase(const Key& key) {
alpar@1402:       Value val = Map::operator[](key);
deba@1413:       typename Container::iterator it = invMap.find(val);
alpar@1402:       if (it != invMap.end() && it->second == key) {
alpar@1402: 	invMap.erase(it);
alpar@1402:       }
alpar@1402:       Map::erase(key);
alpar@1402:     }
alpar@1402: 
deba@1829:     /// \brief Erase more keys from the map.
deba@1829:     ///
deba@1829:     /// Erase more keys from the map. It is called by the
deba@1829:     /// \c AlterationNotifier.
deba@1829:     virtual void erase(const std::vector<Key>& keys) {
deba@1829:       for (int i = 0; i < (int)keys.size(); ++i) {
deba@1829: 	Value val = Map::operator[](keys[i]);
deba@1829: 	typename Container::iterator it = invMap.find(val);
deba@1829: 	if (it != invMap.end() && it->second == keys[i]) {
deba@1829: 	  invMap.erase(it);
deba@1829: 	}
deba@1829:       }
deba@1829:       Map::erase(keys);
deba@1829:     }
deba@1829: 
alpar@1402:     /// \brief Clear the keys from the map and inverse map.
alpar@1402:     ///
alpar@1402:     /// Clear the keys from the map and inverse map. It is called by the
alpar@1402:     /// \c AlterationNotifier.
alpar@1402:     virtual void clear() {
alpar@1402:       invMap.clear();
alpar@1402:       Map::clear();
alpar@1402:     }
alpar@1402: 
deba@1413:   public:
deba@1413: 
deba@1413:     /// \brief The inverse map type.
deba@1413:     ///
deba@1413:     /// The inverse of this map. The subscript operator of the map
deba@1413:     /// gives back always the item what was last assigned to the value. 
deba@1413:     class InverseMap {
deba@1413:     public:
deba@1413:       /// \brief Constructor of the InverseMap.
deba@1413:       ///
deba@1413:       /// Constructor of the InverseMap.
deba@1413:       InverseMap(const InvertableMap& _inverted) : inverted(_inverted) {}
deba@1413: 
deba@1413:       /// The value type of the InverseMap.
deba@1413:       typedef typename InvertableMap::Key Value;
deba@1413:       /// The key type of the InverseMap.
deba@1413:       typedef typename InvertableMap::Value Key; 
deba@1413: 
deba@1413:       /// \brief Subscript operator. 
deba@1413:       ///
deba@1413:       /// Subscript operator. It gives back always the item 
deba@1413:       /// what was last assigned to the value.
deba@1413:       Value operator[](const Key& key) const {
deba@1413: 	typename Container::const_iterator it = inverted.invMap.find(key);
deba@1413: 	return it->second;
deba@1413:       }
deba@1413:       
deba@1413:     private:
deba@1413:       const InvertableMap& inverted;
deba@1413:     };
deba@1413: 
alpar@2094:     /// \brief It gives back the just readable inverse map.
alpar@1402:     ///
alpar@2094:     /// It gives back the just readable inverse map.
deba@1413:     InverseMap inverse() const {
deba@1413:       return InverseMap(*this);
alpar@1402:     } 
alpar@1402: 
alpar@1402: 
deba@1413:     
alpar@1402:   };
alpar@1402: 
alpar@1402:   /// \brief Provides a mutable, continuous and unique descriptor for each 
alpar@1402:   /// item in the graph.
alpar@1402:   ///
athos@1540:   /// The DescriptorMap class provides a unique and continuous (but mutable)
athos@1540:   /// descriptor (id) for each item of the same type (e.g. node) in the
athos@1540:   /// graph. This id is <ul><li>\b unique: different items (nodes) get
athos@1540:   /// different ids <li>\b continuous: the range of the ids is the set of
athos@1540:   /// integers between 0 and \c n-1, where \c n is the number of the items of
athos@1540:   /// this type (e.g. nodes) (so the id of a node can change if you delete an
athos@1540:   /// other node, i.e. this id is mutable).  </ul> This map can be inverted
athos@1540:   /// with its member class \c InverseMap.
alpar@1402:   ///
alpar@1402:   /// \param _Graph The graph class the \c DescriptorMap belongs to.
alpar@1402:   /// \param _Item The Item is the Key of the Map. It may be Node, Edge or 
klao@1909:   /// UEdge.
deba@1830: #ifndef DOXYGEN
alpar@1402:   /// \param _Map A ReadWriteMap mapping from the item type to integer.
alpar@1402:   template <
deba@1990:     typename _Graph, typename _Item,
deba@1990:     typename _Map = DefaultMap<_Graph, _Item, int>
alpar@1402:   >
deba@1830: #else
deba@1830:   template <typename _Graph, typename _Item>
deba@1830: #endif
alpar@1402:   class DescriptorMap : protected _Map {
alpar@1402: 
alpar@1402:     typedef _Item Item;
alpar@1402:     typedef _Map Map;
alpar@1402: 
alpar@1402:   public:
alpar@1402:     /// The graph class of DescriptorMap.
alpar@1402:     typedef _Graph Graph;
alpar@1402: 
klao@1909:     /// The key type of DescriptorMap (Node, Edge, UEdge).
alpar@1402:     typedef typename _Map::Key Key;
alpar@1402:     /// The value type of DescriptorMap.
alpar@1402:     typedef typename _Map::Value Value;
alpar@1402: 
alpar@1402:     /// \brief Constructor.
alpar@1402:     ///
deba@1413:     /// Constructor for descriptor map.
alpar@1402:     DescriptorMap(const Graph& _graph) : Map(_graph) {
alpar@1402:       build();
alpar@1402:     }
alpar@1402: 
deba@1515:   protected:
deba@1515: 
alpar@1402:     /// \brief Add a new key to the map.
alpar@1402:     ///
alpar@1402:     /// Add a new key to the map. It is called by the
alpar@1402:     /// \c AlterationNotifier.
alpar@1402:     virtual void add(const Item& item) {
alpar@1402:       Map::add(item);
alpar@1402:       Map::set(item, invMap.size());
alpar@1402:       invMap.push_back(item);
alpar@1402:     }
alpar@1402: 
deba@1829:     /// \brief Add more new keys to the map.
deba@1829:     ///
deba@1829:     /// Add more new keys to the map. It is called by the
deba@1829:     /// \c AlterationNotifier.
deba@1829:     virtual void add(const std::vector<Item>& items) {
deba@1829:       Map::add(items);
deba@1829:       for (int i = 0; i < (int)items.size(); ++i) {
deba@1829: 	Map::set(items[i], invMap.size());
deba@1829: 	invMap.push_back(items[i]);
deba@1829:       }
deba@1829:     }
deba@1829: 
alpar@1402:     /// \brief Erase the key from the map.
alpar@1402:     ///
deba@1829:     /// Erase the key from the map. It is called by the
alpar@1402:     /// \c AlterationNotifier.
alpar@1402:     virtual void erase(const Item& item) {
alpar@1402:       Map::set(invMap.back(), Map::operator[](item));
alpar@1402:       invMap[Map::operator[](item)] = invMap.back();
deba@1413:       invMap.pop_back();
alpar@1402:       Map::erase(item);
alpar@1402:     }
alpar@1402: 
deba@1829:     /// \brief Erase more keys from the map.
deba@1829:     ///
deba@1829:     /// Erase more keys from the map. It is called by the
deba@1829:     /// \c AlterationNotifier.
deba@1829:     virtual void erase(const std::vector<Item>& items) {
deba@1829:       for (int i = 0; i < (int)items.size(); ++i) {
deba@1829: 	Map::set(invMap.back(), Map::operator[](items[i]));
deba@1829: 	invMap[Map::operator[](items[i])] = invMap.back();
deba@1829: 	invMap.pop_back();
deba@1829:       }
deba@1829:       Map::erase(items);
deba@1829:     }
deba@1829: 
alpar@1402:     /// \brief Build the unique map.
alpar@1402:     ///
alpar@1402:     /// Build the unique map. It is called by the
alpar@1402:     /// \c AlterationNotifier.
alpar@1402:     virtual void build() {
alpar@1402:       Map::build();
alpar@1402:       Item it;
deba@1999:       const typename Map::Notifier* notifier = Map::getNotifier(); 
deba@1999:       for (notifier->first(it); it != INVALID; notifier->next(it)) {
alpar@1402: 	Map::set(it, invMap.size());
alpar@1402: 	invMap.push_back(it);	
alpar@1402:       }      
alpar@1402:     }
alpar@1402:     
alpar@1402:     /// \brief Clear the keys from the map.
alpar@1402:     ///
alpar@1402:     /// Clear the keys from the map. It is called by the
alpar@1402:     /// \c AlterationNotifier.
alpar@1402:     virtual void clear() {
alpar@1402:       invMap.clear();
alpar@1402:       Map::clear();
alpar@1402:     }
alpar@1402: 
deba@1538:   public:
deba@1538: 
deba@1931:     /// \brief Returns the maximal value plus one.
deba@1931:     ///
deba@1931:     /// Returns the maximal value plus one in the map.
deba@1931:     unsigned int size() const {
deba@1931:       return invMap.size();
deba@1931:     }
deba@1931: 
deba@1552:     /// \brief Swaps the position of the two items in the map.
deba@1552:     ///
deba@1552:     /// Swaps the position of the two items in the map.
deba@1552:     void swap(const Item& p, const Item& q) {
deba@1552:       int pi = Map::operator[](p);
deba@1552:       int qi = Map::operator[](q);
deba@1552:       Map::set(p, qi);
deba@1552:       invMap[qi] = p;
deba@1552:       Map::set(q, pi);
deba@1552:       invMap[pi] = q;
deba@1552:     }
deba@1552: 
alpar@1402:     /// \brief Gives back the \e descriptor of the item.
alpar@1402:     ///
alpar@1402:     /// Gives back the mutable and unique \e descriptor of the map.
alpar@1402:     int operator[](const Item& item) const {
alpar@1402:       return Map::operator[](item);
alpar@1402:     }
alpar@1402:     
deba@1413:   private:
deba@1413: 
deba@1413:     typedef std::vector<Item> Container;
deba@1413:     Container invMap;
deba@1413: 
deba@1413:   public:
athos@1540:     /// \brief The inverse map type of DescriptorMap.
deba@1413:     ///
athos@1540:     /// The inverse map type of DescriptorMap.
deba@1413:     class InverseMap {
deba@1413:     public:
deba@1413:       /// \brief Constructor of the InverseMap.
deba@1413:       ///
deba@1413:       /// Constructor of the InverseMap.
deba@1413:       InverseMap(const DescriptorMap& _inverted) 
deba@1413: 	: inverted(_inverted) {}
deba@1413: 
deba@1413: 
deba@1413:       /// The value type of the InverseMap.
deba@1413:       typedef typename DescriptorMap::Key Value;
deba@1413:       /// The key type of the InverseMap.
deba@1413:       typedef typename DescriptorMap::Value Key; 
deba@1413: 
deba@1413:       /// \brief Subscript operator. 
deba@1413:       ///
deba@1413:       /// Subscript operator. It gives back the item 
deba@1413:       /// that the descriptor belongs to currently.
deba@1413:       Value operator[](const Key& key) const {
deba@1413: 	return inverted.invMap[key];
deba@1413:       }
deba@1470: 
deba@1470:       /// \brief Size of the map.
deba@1470:       ///
deba@1470:       /// Returns the size of the map.
deba@1931:       unsigned int size() const {
deba@1470: 	return inverted.invMap.size();
deba@1470:       }
deba@1413:       
deba@1413:     private:
deba@1413:       const DescriptorMap& inverted;
deba@1413:     };
deba@1413: 
alpar@1402:     /// \brief Gives back the inverse of the map.
alpar@1402:     ///
alpar@1402:     /// Gives back the inverse of the map.
alpar@1402:     const InverseMap inverse() const {
deba@1413:       return InverseMap(*this);
alpar@1402:     }
alpar@1402:   };
alpar@1402: 
alpar@1402:   /// \brief Returns the source of the given edge.
alpar@1402:   ///
alpar@1402:   /// The SourceMap gives back the source Node of the given edge. 
alpar@1402:   /// \author Balazs Dezso
alpar@1402:   template <typename Graph>
alpar@1402:   class SourceMap {
alpar@1402:   public:
deba@1419: 
alpar@1402:     typedef typename Graph::Node Value;
alpar@1402:     typedef typename Graph::Edge Key;
alpar@1402: 
alpar@1402:     /// \brief Constructor
alpar@1402:     ///
alpar@1402:     /// Constructor
alpar@1402:     /// \param _graph The graph that the map belongs to.
alpar@1402:     SourceMap(const Graph& _graph) : graph(_graph) {}
alpar@1402: 
alpar@1402:     /// \brief The subscript operator.
alpar@1402:     ///
alpar@1402:     /// The subscript operator.
alpar@1402:     /// \param edge The edge 
alpar@1402:     /// \return The source of the edge 
deba@1679:     Value operator[](const Key& edge) const {
alpar@1402:       return graph.source(edge);
alpar@1402:     }
alpar@1402: 
alpar@1402:   private:
alpar@1402:     const Graph& graph;
alpar@1402:   };
alpar@1402: 
alpar@1402:   /// \brief Returns a \ref SourceMap class
alpar@1402:   ///
alpar@1402:   /// This function just returns an \ref SourceMap class.
alpar@1402:   /// \relates SourceMap
alpar@1402:   template <typename Graph>
alpar@1402:   inline SourceMap<Graph> sourceMap(const Graph& graph) {
alpar@1402:     return SourceMap<Graph>(graph);
alpar@1402:   } 
alpar@1402: 
alpar@1402:   /// \brief Returns the target of the given edge.
alpar@1402:   ///
alpar@1402:   /// The TargetMap gives back the target Node of the given edge. 
alpar@1402:   /// \author Balazs Dezso
alpar@1402:   template <typename Graph>
alpar@1402:   class TargetMap {
alpar@1402:   public:
deba@1419: 
alpar@1402:     typedef typename Graph::Node Value;
alpar@1402:     typedef typename Graph::Edge Key;
alpar@1402: 
alpar@1402:     /// \brief Constructor
alpar@1402:     ///
alpar@1402:     /// Constructor
alpar@1402:     /// \param _graph The graph that the map belongs to.
alpar@1402:     TargetMap(const Graph& _graph) : graph(_graph) {}
alpar@1402: 
alpar@1402:     /// \brief The subscript operator.
alpar@1402:     ///
alpar@1402:     /// The subscript operator.
alpar@1536:     /// \param e The edge 
alpar@1402:     /// \return The target of the edge 
deba@1679:     Value operator[](const Key& e) const {
alpar@1536:       return graph.target(e);
alpar@1402:     }
alpar@1402: 
alpar@1402:   private:
alpar@1402:     const Graph& graph;
alpar@1402:   };
alpar@1402: 
alpar@1402:   /// \brief Returns a \ref TargetMap class
deba@1515:   ///
athos@1540:   /// This function just returns a \ref TargetMap class.
alpar@1402:   /// \relates TargetMap
alpar@1402:   template <typename Graph>
alpar@1402:   inline TargetMap<Graph> targetMap(const Graph& graph) {
alpar@1402:     return TargetMap<Graph>(graph);
alpar@1402:   }
alpar@1402: 
athos@1540:   /// \brief Returns the "forward" directed edge view of an undirected edge.
deba@1419:   ///
athos@1540:   /// Returns the "forward" directed edge view of an undirected edge.
deba@1419:   /// \author Balazs Dezso
deba@1419:   template <typename Graph>
deba@1419:   class ForwardMap {
deba@1419:   public:
deba@1419: 
deba@1419:     typedef typename Graph::Edge Value;
klao@1909:     typedef typename Graph::UEdge Key;
deba@1419: 
deba@1419:     /// \brief Constructor
deba@1419:     ///
deba@1419:     /// Constructor
deba@1419:     /// \param _graph The graph that the map belongs to.
deba@1419:     ForwardMap(const Graph& _graph) : graph(_graph) {}
deba@1419: 
deba@1419:     /// \brief The subscript operator.
deba@1419:     ///
deba@1419:     /// The subscript operator.
deba@1419:     /// \param key An undirected edge 
deba@1419:     /// \return The "forward" directed edge view of undirected edge 
deba@1419:     Value operator[](const Key& key) const {
deba@1627:       return graph.direct(key, true);
deba@1419:     }
deba@1419: 
deba@1419:   private:
deba@1419:     const Graph& graph;
deba@1419:   };
deba@1419: 
deba@1419:   /// \brief Returns a \ref ForwardMap class
deba@1515:   ///
deba@1419:   /// This function just returns an \ref ForwardMap class.
deba@1419:   /// \relates ForwardMap
deba@1419:   template <typename Graph>
deba@1419:   inline ForwardMap<Graph> forwardMap(const Graph& graph) {
deba@1419:     return ForwardMap<Graph>(graph);
deba@1419:   }
deba@1419: 
athos@1540:   /// \brief Returns the "backward" directed edge view of an undirected edge.
deba@1419:   ///
athos@1540:   /// Returns the "backward" directed edge view of an undirected edge.
deba@1419:   /// \author Balazs Dezso
deba@1419:   template <typename Graph>
deba@1419:   class BackwardMap {
deba@1419:   public:
deba@1419: 
deba@1419:     typedef typename Graph::Edge Value;
klao@1909:     typedef typename Graph::UEdge Key;
deba@1419: 
deba@1419:     /// \brief Constructor
deba@1419:     ///
deba@1419:     /// Constructor
deba@1419:     /// \param _graph The graph that the map belongs to.
deba@1419:     BackwardMap(const Graph& _graph) : graph(_graph) {}
deba@1419: 
deba@1419:     /// \brief The subscript operator.
deba@1419:     ///
deba@1419:     /// The subscript operator.
deba@1419:     /// \param key An undirected edge 
deba@1419:     /// \return The "backward" directed edge view of undirected edge 
deba@1419:     Value operator[](const Key& key) const {
deba@1627:       return graph.direct(key, false);
deba@1419:     }
deba@1419: 
deba@1419:   private:
deba@1419:     const Graph& graph;
deba@1419:   };
deba@1419: 
deba@1419:   /// \brief Returns a \ref BackwardMap class
deba@1419: 
athos@1540:   /// This function just returns a \ref BackwardMap class.
deba@1419:   /// \relates BackwardMap
deba@1419:   template <typename Graph>
deba@1419:   inline BackwardMap<Graph> backwardMap(const Graph& graph) {
deba@1419:     return BackwardMap<Graph>(graph);
deba@1419:   }
deba@1419: 
deba@1695:   /// \brief Potential difference map
deba@1695:   ///
deba@1695:   /// If there is an potential map on the nodes then we
deba@1695:   /// can get an edge map as we get the substraction of the
deba@1695:   /// values of the target and source.
deba@1695:   template <typename Graph, typename NodeMap>
deba@1695:   class PotentialDifferenceMap {
deba@1515:   public:
deba@1695:     typedef typename Graph::Edge Key;
deba@1695:     typedef typename NodeMap::Value Value;
deba@1695: 
deba@1695:     /// \brief Constructor
deba@1695:     ///
deba@1695:     /// Contructor of the map
deba@1695:     PotentialDifferenceMap(const Graph& _graph, const NodeMap& _potential) 
deba@1695:       : graph(_graph), potential(_potential) {}
deba@1695: 
deba@1695:     /// \brief Const subscription operator
deba@1695:     ///
deba@1695:     /// Const subscription operator
deba@1695:     Value operator[](const Key& edge) const {
deba@1695:       return potential[graph.target(edge)] - potential[graph.source(edge)];
deba@1695:     }
deba@1695: 
deba@1695:   private:
deba@1695:     const Graph& graph;
deba@1695:     const NodeMap& potential;
deba@1695:   };
deba@1695: 
deba@1695:   /// \brief Just returns a PotentialDifferenceMap
deba@1695:   ///
deba@1695:   /// Just returns a PotentialDifferenceMap
deba@1695:   /// \relates PotentialDifferenceMap
deba@1695:   template <typename Graph, typename NodeMap>
deba@1695:   PotentialDifferenceMap<Graph, NodeMap> 
deba@1695:   potentialDifferenceMap(const Graph& graph, const NodeMap& potential) {
deba@1695:     return PotentialDifferenceMap<Graph, NodeMap>(graph, potential);
deba@1695:   }
deba@1695: 
deba@1515:   /// \brief Map of the node in-degrees.
alpar@1453:   ///
athos@1540:   /// This map returns the in-degree of a node. Once it is constructed,
deba@1515:   /// the degrees are stored in a standard NodeMap, so each query is done
athos@1540:   /// in constant time. On the other hand, the values are updated automatically
deba@1515:   /// whenever the graph changes.
deba@1515:   ///
deba@1729:   /// \warning Besides addNode() and addEdge(), a graph structure may provide
deba@1730:   /// alternative ways to modify the graph. The correct behavior of InDegMap
deba@1829:   /// is not guarantied if these additional features are used. For example
deba@1829:   /// the functions \ref ListGraph::changeSource() "changeSource()",
deba@1729:   /// \ref ListGraph::changeTarget() "changeTarget()" and
deba@1729:   /// \ref ListGraph::reverseEdge() "reverseEdge()"
deba@1729:   /// of \ref ListGraph will \e not update the degree values correctly.
deba@1729:   ///
deba@1515:   /// \sa OutDegMap
deba@1515: 
alpar@1453:   template <typename _Graph>
deba@1515:   class InDegMap  
deba@1999:     : protected ItemSetTraits<_Graph, typename _Graph::Edge>
deba@1999:       ::ItemNotifier::ObserverBase {
deba@1515: 
alpar@1453:   public:
deba@1515:     
deba@1515:     typedef _Graph Graph;
alpar@1453:     typedef int Value;
deba@1515:     typedef typename Graph::Node Key;
deba@1515: 
deba@1999:     typedef typename ItemSetTraits<_Graph, typename _Graph::Edge>
deba@1999:     ::ItemNotifier::ObserverBase Parent;
deba@1999: 
deba@1515:   private:
deba@1515: 
deba@1990:     class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
deba@1515:     public:
deba@1515: 
deba@1990:       typedef DefaultMap<_Graph, Key, int> Parent;
deba@2002:       typedef typename Parent::Graph Graph;
deba@1515: 
deba@1515:       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
deba@1515:       
deba@1829:       virtual void add(const Key& key) {
deba@1515: 	Parent::add(key);
deba@1515: 	Parent::set(key, 0);
deba@1515:       }
deba@1931: 
deba@1829:       virtual void add(const std::vector<Key>& keys) {
deba@1829: 	Parent::add(keys);
deba@1829: 	for (int i = 0; i < (int)keys.size(); ++i) {
deba@1829: 	  Parent::set(keys[i], 0);
deba@1829: 	}
deba@1829:       }
deba@1515:     };
deba@1515: 
deba@1515:   public:
alpar@1453: 
alpar@1453:     /// \brief Constructor.
alpar@1453:     ///
alpar@1453:     /// Constructor for creating in-degree map.
deba@1515:     InDegMap(const Graph& _graph) : graph(_graph), deg(_graph) {
deba@1999:       Parent::attach(graph.getNotifier(typename _Graph::Edge()));
deba@1515:       
deba@1515:       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
deba@1515: 	deg[it] = countInEdges(graph, it);
deba@1515:       }
alpar@1453:     }
alpar@1453:     
alpar@1459:     /// Gives back the in-degree of a Node.
deba@1515:     int operator[](const Key& key) const {
deba@1515:       return deg[key];
alpar@1459:     }
alpar@1453: 
alpar@1453:   protected:
deba@1515:     
deba@1515:     typedef typename Graph::Edge Edge;
deba@1515: 
deba@1515:     virtual void add(const Edge& edge) {
deba@1515:       ++deg[graph.target(edge)];
alpar@1453:     }
alpar@1453: 
deba@1931:     virtual void add(const std::vector<Edge>& edges) {
deba@1931:       for (int i = 0; i < (int)edges.size(); ++i) {
deba@1931:         ++deg[graph.target(edges[i])];
deba@1931:       }
deba@1931:     }
deba@1931: 
deba@1515:     virtual void erase(const Edge& edge) {
deba@1515:       --deg[graph.target(edge)];
deba@1515:     }
deba@1515: 
deba@1931:     virtual void erase(const std::vector<Edge>& edges) {
deba@1931:       for (int i = 0; i < (int)edges.size(); ++i) {
deba@1931:         --deg[graph.target(edges[i])];
deba@1931:       }
deba@1931:     }
deba@1931: 
deba@1515:     virtual void build() {
deba@1515:       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
deba@1515: 	deg[it] = countInEdges(graph, it);
deba@1515:       }      
deba@1515:     }
deba@1515: 
deba@1515:     virtual void clear() {
deba@1515:       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
deba@1515: 	deg[it] = 0;
deba@1515:       }
deba@1515:     }
deba@1515:   private:
alpar@1506:     
deba@1515:     const _Graph& graph;
deba@1515:     AutoNodeMap deg;
alpar@1459:   };
alpar@1459: 
deba@1515:   /// \brief Map of the node out-degrees.
deba@1515:   ///
athos@1540:   /// This map returns the out-degree of a node. Once it is constructed,
deba@1515:   /// the degrees are stored in a standard NodeMap, so each query is done
athos@1540:   /// in constant time. On the other hand, the values are updated automatically
deba@1515:   /// whenever the graph changes.
deba@1515:   ///
deba@1729:   /// \warning Besides addNode() and addEdge(), a graph structure may provide
deba@1730:   /// alternative ways to modify the graph. The correct behavior of OutDegMap
deba@1829:   /// is not guarantied if these additional features are used. For example
deba@1829:   /// the functions \ref ListGraph::changeSource() "changeSource()",
deba@1729:   /// \ref ListGraph::changeTarget() "changeTarget()" and
deba@1729:   /// \ref ListGraph::reverseEdge() "reverseEdge()"
deba@1729:   /// of \ref ListGraph will \e not update the degree values correctly.
deba@1729:   ///
alpar@1555:   /// \sa InDegMap
alpar@1459: 
alpar@1459:   template <typename _Graph>
deba@1515:   class OutDegMap  
deba@1999:     : protected ItemSetTraits<_Graph, typename _Graph::Edge>
deba@1999:       ::ItemNotifier::ObserverBase {
deba@1515: 
alpar@1459:   public:
deba@1999: 
deba@1999:     typedef typename ItemSetTraits<_Graph, typename _Graph::Edge>
deba@1999:     ::ItemNotifier::ObserverBase Parent;
deba@1515:     
deba@1515:     typedef _Graph Graph;
alpar@1459:     typedef int Value;
deba@1515:     typedef typename Graph::Node Key;
deba@1515: 
deba@1515:   private:
deba@1515: 
deba@1990:     class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
deba@1515:     public:
deba@1515: 
deba@1990:       typedef DefaultMap<_Graph, Key, int> Parent;
deba@2002:       typedef typename Parent::Graph Graph;
deba@1515: 
deba@1515:       AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
deba@1515:       
deba@1829:       virtual void add(const Key& key) {
deba@1515: 	Parent::add(key);
deba@1515: 	Parent::set(key, 0);
deba@1515:       }
deba@1829:       virtual void add(const std::vector<Key>& keys) {
deba@1829: 	Parent::add(keys);
deba@1829: 	for (int i = 0; i < (int)keys.size(); ++i) {
deba@1829: 	  Parent::set(keys[i], 0);
deba@1829: 	}
deba@1829:       }
deba@1515:     };
deba@1515: 
deba@1515:   public:
alpar@1459: 
alpar@1459:     /// \brief Constructor.
alpar@1459:     ///
alpar@1459:     /// Constructor for creating out-degree map.
deba@1515:     OutDegMap(const Graph& _graph) : graph(_graph), deg(_graph) {
deba@1999:       Parent::attach(graph.getNotifier(typename _Graph::Edge()));
deba@1515:       
deba@1515:       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
deba@1515: 	deg[it] = countOutEdges(graph, it);
deba@1515:       }
alpar@1459:     }
alpar@1459: 
deba@1990:     /// Gives back the out-degree of a Node.
deba@1515:     int operator[](const Key& key) const {
deba@1515:       return deg[key];
alpar@1459:     }
alpar@1459: 
alpar@1459:   protected:
deba@1515:     
deba@1515:     typedef typename Graph::Edge Edge;
deba@1515: 
deba@1515:     virtual void add(const Edge& edge) {
deba@1515:       ++deg[graph.source(edge)];
alpar@1459:     }
alpar@1459: 
deba@1931:     virtual void add(const std::vector<Edge>& edges) {
deba@1931:       for (int i = 0; i < (int)edges.size(); ++i) {
deba@1931:         ++deg[graph.source(edges[i])];
deba@1931:       }
deba@1931:     }
deba@1931: 
deba@1515:     virtual void erase(const Edge& edge) {
deba@1515:       --deg[graph.source(edge)];
deba@1515:     }
deba@1515: 
deba@1931:     virtual void erase(const std::vector<Edge>& edges) {
deba@1931:       for (int i = 0; i < (int)edges.size(); ++i) {
deba@1931:         --deg[graph.source(edges[i])];
deba@1931:       }
deba@1931:     }
deba@1931: 
deba@1515:     virtual void build() {
deba@1515:       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
deba@1515: 	deg[it] = countOutEdges(graph, it);
deba@1515:       }      
deba@1515:     }
deba@1515: 
deba@1515:     virtual void clear() {
deba@1515:       for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
deba@1515: 	deg[it] = 0;
deba@1515:       }
deba@1515:     }
deba@1515:   private:
alpar@1506:     
deba@1515:     const _Graph& graph;
deba@1515:     AutoNodeMap deg;
alpar@1453:   };
alpar@1453: 
deba@1695: 
alpar@1402:   /// @}
alpar@1402: 
alpar@947: } //END OF NAMESPACE LEMON
klao@946: 
klao@946: #endif