COIN-OR::LEMON - Graph Library

source: lemon-0.x/lemon/graph_utils.h @ 2059:ebf3b2962554

Last change on this file since 2059:ebf3b2962554 was 2031:080d51024ac5, checked in by Balazs Dezso, 18 years ago

Correcting the structure of the graph's and adaptor's map.
The template assign operators and map iterators can be used for adaptors also.

Some bugfix in the adaptors

New class SwapBpUGraphAdaptor which swaps the two nodeset of the graph.

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