COIN-OR::LEMON - Graph Library

source: lemon-0.x/lemon/graph_utils.h @ 1824:3a15b39a7c78

Last change on this file since 1824:3a15b39a7c78 was 1811:597ce92fae73, checked in by Alpar Juttner, 18 years ago

Several bugfices.

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