COIN-OR::LEMON - Graph Library

source: lemon-0.x/lemon/graph_utils.h @ 1992:6e1b62d42d94

Last change on this file since 1992:6e1b62d42d94 was 1992:6e1b62d42d94, checked in by Balazs Dezso, 18 years ago

UNDIRGRAPH_TYPEDEFS => UGRAPH_TYPEDEFS

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