3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
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.
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
19 #ifndef LEMON_GRAPH_UTILS_H
20 #define LEMON_GRAPH_UTILS_H
28 #include <lemon/bits/invalid.h>
29 #include <lemon/bits/utility.h>
30 #include <lemon/maps.h>
31 #include <lemon/bits/traits.h>
33 #include <lemon/bits/alteration_notifier.h>
34 #include <lemon/bits/default_map.h>
38 ///\brief Graph utilities.
42 /// \addtogroup gutils
45 ///Creates convenience typedefs for the digraph types and iterators
47 ///This \c \#define creates convenience typedefs for the following types
48 ///of \c Digraph: \c Node, \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
49 ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap,
50 ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap.
52 ///\note If the graph type is a dependent type, ie. the graph type depend
53 ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
55 #define DIGRAPH_TYPEDEFS(Digraph) \
56 typedef Digraph::Node Node; \
57 typedef Digraph::NodeIt NodeIt; \
58 typedef Digraph::Arc Arc; \
59 typedef Digraph::ArcIt ArcIt; \
60 typedef Digraph::InArcIt InArcIt; \
61 typedef Digraph::OutArcIt OutArcIt; \
62 typedef Digraph::NodeMap<bool> BoolNodeMap; \
63 typedef Digraph::NodeMap<int> IntNodeMap; \
64 typedef Digraph::NodeMap<double> DoubleNodeMap; \
65 typedef Digraph::ArcMap<bool> BoolArcMap; \
66 typedef Digraph::ArcMap<int> IntArcMap; \
67 typedef Digraph::ArcMap<double> DoubleArcMap
69 ///Creates convenience typedefs for the digraph types and iterators
71 ///\see DIGRAPH_TYPEDEFS
73 ///\note Use this macro, if the graph type is a dependent type,
74 ///ie. the graph type depend on a template parameter.
75 #define TEMPLATE_DIGRAPH_TYPEDEFS(Digraph) \
76 typedef typename Digraph::Node Node; \
77 typedef typename Digraph::NodeIt NodeIt; \
78 typedef typename Digraph::Arc Arc; \
79 typedef typename Digraph::ArcIt ArcIt; \
80 typedef typename Digraph::InArcIt InArcIt; \
81 typedef typename Digraph::OutArcIt OutArcIt; \
82 typedef typename Digraph::template NodeMap<bool> BoolNodeMap; \
83 typedef typename Digraph::template NodeMap<int> IntNodeMap; \
84 typedef typename Digraph::template NodeMap<double> DoubleNodeMap; \
85 typedef typename Digraph::template ArcMap<bool> BoolArcMap; \
86 typedef typename Digraph::template ArcMap<int> IntArcMap; \
87 typedef typename Digraph::template ArcMap<double> DoubleArcMap
89 ///Creates convenience typedefs for the graph types and iterators
91 ///This \c \#define creates the same convenience typedefs as defined
92 ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
93 ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
96 ///\note If the graph type is a dependent type, ie. the graph type depend
97 ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
99 #define GRAPH_TYPEDEFS(Graph) \
100 DIGRAPH_TYPEDEFS(Graph); \
101 typedef Graph::Edge Edge; \
102 typedef Graph::EdgeIt EdgeIt; \
103 typedef Graph::IncEdgeIt IncEdgeIt; \
104 typedef Graph::EdgeMap<bool> BoolEdgeMap; \
105 typedef Graph::EdgeMap<int> IntEdgeMap; \
106 typedef Graph::EdgeMap<double> DoubleEdgeMap
108 ///Creates convenience typedefs for the graph types and iterators
110 ///\see GRAPH_TYPEDEFS
112 ///\note Use this macro, if the graph type is a dependent type,
113 ///ie. the graph type depend on a template parameter.
114 #define TEMPLATE_GRAPH_TYPEDEFS(Graph) \
115 TEMPLATE_DIGRAPH_TYPEDEFS(Graph); \
116 typedef typename Graph::Edge Edge; \
117 typedef typename Graph::EdgeIt EdgeIt; \
118 typedef typename Graph::IncEdgeIt IncEdgeIt; \
119 typedef typename Graph::template EdgeMap<bool> BoolEdgeMap; \
120 typedef typename Graph::template EdgeMap<int> IntEdgeMap; \
121 typedef typename Graph::template EdgeMap<double> DoubleEdgeMap
123 /// \brief Function to count the items in the graph.
125 /// This function counts the items (nodes, arcs etc) in the graph.
126 /// The complexity of the function is O(n) because
127 /// it iterates on all of the items.
128 template <typename Graph, typename Item>
129 inline int countItems(const Graph& g) {
130 typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
132 for (ItemIt it(g); it != INVALID; ++it) {
140 namespace _graph_utils_bits {
142 template <typename Graph, typename Enable = void>
143 struct CountNodesSelector {
144 static int count(const Graph &g) {
145 return countItems<Graph, typename Graph::Node>(g);
149 template <typename Graph>
150 struct CountNodesSelector<
152 enable_if<typename Graph::NodeNumTag, void>::type>
154 static int count(const Graph &g) {
160 /// \brief Function to count the nodes in the graph.
162 /// This function counts the nodes in the graph.
163 /// The complexity of the function is O(n) but for some
164 /// graph structures it is specialized to run in O(1).
166 /// If the graph contains a \e nodeNum() member function and a
167 /// \e NodeNumTag tag then this function calls directly the member
168 /// function to query the cardinality of the node set.
169 template <typename Graph>
170 inline int countNodes(const Graph& g) {
171 return _graph_utils_bits::CountNodesSelector<Graph>::count(g);
176 namespace _graph_utils_bits {
178 template <typename Graph, typename Enable = void>
179 struct CountArcsSelector {
180 static int count(const Graph &g) {
181 return countItems<Graph, typename Graph::Arc>(g);
185 template <typename Graph>
186 struct CountArcsSelector<
188 typename enable_if<typename Graph::ArcNumTag, void>::type>
190 static int count(const Graph &g) {
196 /// \brief Function to count the arcs in the graph.
198 /// This function counts the arcs in the graph.
199 /// The complexity of the function is O(e) but for some
200 /// graph structures it is specialized to run in O(1).
202 /// If the graph contains a \e arcNum() member function and a
203 /// \e EdgeNumTag tag then this function calls directly the member
204 /// function to query the cardinality of the arc set.
205 template <typename Graph>
206 inline int countArcs(const Graph& g) {
207 return _graph_utils_bits::CountArcsSelector<Graph>::count(g);
211 namespace _graph_utils_bits {
213 template <typename Graph, typename Enable = void>
214 struct CountEdgesSelector {
215 static int count(const Graph &g) {
216 return countItems<Graph, typename Graph::Edge>(g);
220 template <typename Graph>
221 struct CountEdgesSelector<
223 typename enable_if<typename Graph::EdgeNumTag, void>::type>
225 static int count(const Graph &g) {
231 /// \brief Function to count the edges in the graph.
233 /// This function counts the edges in the graph.
234 /// The complexity of the function is O(m) but for some
235 /// graph structures it is specialized to run in O(1).
237 /// If the graph contains a \e edgeNum() member function and a
238 /// \e EdgeNumTag tag then this function calls directly the member
239 /// function to query the cardinality of the edge set.
240 template <typename Graph>
241 inline int countEdges(const Graph& g) {
242 return _graph_utils_bits::CountEdgesSelector<Graph>::count(g);
247 template <typename Graph, typename DegIt>
248 inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
250 for (DegIt it(_g, _n); it != INVALID; ++it) {
256 /// \brief Function to count the number of the out-arcs from node \c n.
258 /// This function counts the number of the out-arcs from node \c n
260 template <typename Graph>
261 inline int countOutArcs(const Graph& _g, const typename Graph::Node& _n) {
262 return countNodeDegree<Graph, typename Graph::OutArcIt>(_g, _n);
265 /// \brief Function to count the number of the in-arcs to node \c n.
267 /// This function counts the number of the in-arcs to node \c n
269 template <typename Graph>
270 inline int countInArcs(const Graph& _g, const typename Graph::Node& _n) {
271 return countNodeDegree<Graph, typename Graph::InArcIt>(_g, _n);
274 /// \brief Function to count the number of the inc-edges to node \c n.
276 /// This function counts the number of the inc-edges to node \c n
278 template <typename Graph>
279 inline int countIncEdges(const Graph& _g, const typename Graph::Node& _n) {
280 return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n);
283 namespace _graph_utils_bits {
285 template <typename Graph, typename Enable = void>
286 struct FindArcSelector {
287 typedef typename Graph::Node Node;
288 typedef typename Graph::Arc Arc;
289 static Arc find(const Graph &g, Node u, Node v, Arc e) {
295 while (e != INVALID && g.target(e) != v) {
302 template <typename Graph>
303 struct FindArcSelector<
305 typename enable_if<typename Graph::FindEdgeTag, void>::type>
307 typedef typename Graph::Node Node;
308 typedef typename Graph::Arc Arc;
309 static Arc find(const Graph &g, Node u, Node v, Arc prev) {
310 return g.findArc(u, v, prev);
315 /// \brief Finds an arc between two nodes of a graph.
317 /// Finds an arc from node \c u to node \c v in graph \c g.
319 /// If \c prev is \ref INVALID (this is the default value), then
320 /// it finds the first arc from \c u to \c v. Otherwise it looks for
321 /// the next arc from \c u to \c v after \c prev.
322 /// \return The found arc or \ref INVALID if there is no such an arc.
324 /// Thus you can iterate through each arc from \c u to \c v as it follows.
326 /// for(Arc e=findArc(g,u,v);e!=INVALID;e=findArc(g,u,v,e)) {
335 template <typename Graph>
336 inline typename Graph::Arc
337 findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v,
338 typename Graph::Arc prev = INVALID) {
339 return _graph_utils_bits::FindArcSelector<Graph>::find(g, u, v, prev);
342 /// \brief Iterator for iterating on arcs connected the same nodes.
344 /// Iterator for iterating on arcs connected the same nodes. It is
345 /// higher level interface for the findArc() function. You can
346 /// use it the following way:
348 /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
357 template <typename _Graph>
358 class ConArcIt : public _Graph::Arc {
361 typedef _Graph Graph;
362 typedef typename Graph::Arc Parent;
364 typedef typename Graph::Arc Arc;
365 typedef typename Graph::Node Node;
367 /// \brief Constructor.
369 /// Construct a new ConArcIt iterating on the arcs which
370 /// connects the \c u and \c v node.
371 ConArcIt(const Graph& g, Node u, Node v) : _graph(g) {
372 Parent::operator=(findArc(_graph, u, v));
375 /// \brief Constructor.
377 /// Construct a new ConArcIt which continues the iterating from
379 ConArcIt(const Graph& g, Arc a) : Parent(a), _graph(g) {}
381 /// \brief Increment operator.
383 /// It increments the iterator and gives back the next arc.
384 ConArcIt& operator++() {
385 Parent::operator=(findArc(_graph, _graph.source(*this),
386 _graph.target(*this), *this));
393 namespace _graph_utils_bits {
395 template <typename Graph, typename Enable = void>
396 struct FindEdgeSelector {
397 typedef typename Graph::Node Node;
398 typedef typename Graph::Edge Edge;
399 static Edge find(const Graph &g, Node u, Node v, Edge e) {
405 b = g.source(e) == u;
408 while (e != INVALID && (b ? g.target(e) : g.source(e)) != v) {
418 while (e != INVALID && (!b || g.target(e) != v)) {
426 template <typename Graph>
427 struct FindEdgeSelector<
429 typename enable_if<typename Graph::FindEdgeTag, void>::type>
431 typedef typename Graph::Node Node;
432 typedef typename Graph::Edge Edge;
433 static Edge find(const Graph &g, Node u, Node v, Edge prev) {
434 return g.findEdge(u, v, prev);
439 /// \brief Finds an edge between two nodes of a graph.
441 /// Finds an edge from node \c u to node \c v in graph \c g.
442 /// If the node \c u and node \c v is equal then each loop edge
443 /// will be enumerated once.
445 /// If \c prev is \ref INVALID (this is the default value), then
446 /// it finds the first arc from \c u to \c v. Otherwise it looks for
447 /// the next arc from \c u to \c v after \c prev.
448 /// \return The found arc or \ref INVALID if there is no such an arc.
450 /// Thus you can iterate through each arc from \c u to \c v as it follows.
452 /// for(Edge e = findEdge(g,u,v); e != INVALID;
453 /// e = findEdge(g,u,v,e)) {
460 template <typename Graph>
461 inline typename Graph::Edge
462 findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
463 typename Graph::Edge p = INVALID) {
464 return _graph_utils_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
467 /// \brief Iterator for iterating on edges connected the same nodes.
469 /// Iterator for iterating on edges connected the same nodes. It is
470 /// higher level interface for the findEdge() function. You can
471 /// use it the following way:
473 /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
479 template <typename _Graph>
480 class ConEdgeIt : public _Graph::Edge {
483 typedef _Graph Graph;
484 typedef typename Graph::Edge Parent;
486 typedef typename Graph::Edge Edge;
487 typedef typename Graph::Node Node;
489 /// \brief Constructor.
491 /// Construct a new ConEdgeIt iterating on the edges which
492 /// connects the \c u and \c v node.
493 ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g) {
494 Parent::operator=(findEdge(_graph, u, v));
497 /// \brief Constructor.
499 /// Construct a new ConEdgeIt which continues the iterating from
501 ConEdgeIt(const Graph& g, Edge e) : Parent(e), _graph(g) {}
503 /// \brief Increment operator.
505 /// It increments the iterator and gives back the next edge.
506 ConEdgeIt& operator++() {
507 Parent::operator=(findEdge(_graph, _graph.source(*this),
508 _graph.target(*this), *this));
515 namespace _graph_utils_bits {
517 template <typename Digraph, typename Item, typename RefMap>
520 virtual void copy(const Digraph& from, const RefMap& refMap) = 0;
522 virtual ~MapCopyBase() {}
525 template <typename Digraph, typename Item, typename RefMap,
526 typename ToMap, typename FromMap>
527 class MapCopy : public MapCopyBase<Digraph, Item, RefMap> {
530 MapCopy(ToMap& tmap, const FromMap& map)
531 : _tmap(tmap), _map(map) {}
533 virtual void copy(const Digraph& digraph, const RefMap& refMap) {
534 typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
535 for (ItemIt it(digraph); it != INVALID; ++it) {
536 _tmap.set(refMap[it], _map[it]);
545 template <typename Digraph, typename Item, typename RefMap, typename It>
546 class ItemCopy : public MapCopyBase<Digraph, Item, RefMap> {
549 ItemCopy(It& it, const Item& item) : _it(it), _item(item) {}
551 virtual void copy(const Digraph&, const RefMap& refMap) {
560 template <typename Digraph, typename Item, typename RefMap, typename Ref>
561 class RefCopy : public MapCopyBase<Digraph, Item, RefMap> {
564 RefCopy(Ref& map) : _map(map) {}
566 virtual void copy(const Digraph& digraph, const RefMap& refMap) {
567 typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
568 for (ItemIt it(digraph); it != INVALID; ++it) {
569 _map.set(it, refMap[it]);
577 template <typename Digraph, typename Item, typename RefMap,
579 class CrossRefCopy : public MapCopyBase<Digraph, Item, RefMap> {
582 CrossRefCopy(CrossRef& cmap) : _cmap(cmap) {}
584 virtual void copy(const Digraph& digraph, const RefMap& refMap) {
585 typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
586 for (ItemIt it(digraph); it != INVALID; ++it) {
587 _cmap.set(refMap[it], it);
595 template <typename Digraph, typename Enable = void>
596 struct DigraphCopySelector {
597 template <typename From, typename NodeRefMap, typename ArcRefMap>
598 static void copy(Digraph &to, const From& from,
599 NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
600 for (typename From::NodeIt it(from); it != INVALID; ++it) {
601 nodeRefMap[it] = to.addNode();
603 for (typename From::ArcIt it(from); it != INVALID; ++it) {
604 arcRefMap[it] = to.addArc(nodeRefMap[from.source(it)],
605 nodeRefMap[from.target(it)]);
610 template <typename Digraph>
611 struct DigraphCopySelector<
613 typename enable_if<typename Digraph::BuildTag, void>::type>
615 template <typename From, typename NodeRefMap, typename ArcRefMap>
616 static void copy(Digraph &to, const From& from,
617 NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
618 to.build(from, nodeRefMap, arcRefMap);
622 template <typename Graph, typename Enable = void>
623 struct GraphCopySelector {
624 template <typename From, typename NodeRefMap, typename EdgeRefMap>
625 static void copy(Graph &to, const From& from,
626 NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
627 for (typename From::NodeIt it(from); it != INVALID; ++it) {
628 nodeRefMap[it] = to.addNode();
630 for (typename From::EdgeIt it(from); it != INVALID; ++it) {
631 edgeRefMap[it] = to.addArc(nodeRefMap[from.source(it)],
632 nodeRefMap[from.target(it)]);
637 template <typename Graph>
638 struct GraphCopySelector<
640 typename enable_if<typename Graph::BuildTag, void>::type>
642 template <typename From, typename NodeRefMap, typename EdgeRefMap>
643 static void copy(Graph &to, const From& from,
644 NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
645 to.build(from, nodeRefMap, edgeRefMap);
651 /// \brief Class to copy a digraph.
653 /// Class to copy a digraph to another digraph (duplicate a digraph). The
654 /// simplest way of using it is through the \c copyDigraph() function.
656 /// This class not just make a copy of a graph, but it can create
657 /// references and cross references between the nodes and arcs of
658 /// the two graphs, it can copy maps for use with the newly created
659 /// graph and copy nodes and arcs.
661 /// To make a copy from a graph, first an instance of DigraphCopy
662 /// should be created, then the data belongs to the graph should
663 /// assigned to copy. In the end, the \c run() member should be
666 /// The next code copies a graph with several data:
668 /// DigraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph);
669 /// // create a reference for the nodes
670 /// OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
672 /// // create a cross reference (inverse) for the arcs
673 /// NewGraph::ArcMap<OrigGraph::Arc> acr(new_graph);
674 /// dc.arcCrossRef(acr);
675 /// // copy an arc map
676 /// OrigGraph::ArcMap<double> oamap(orig_graph);
677 /// NewGraph::ArcMap<double> namap(new_graph);
678 /// dc.arcMap(namap, oamap);
680 /// OrigGraph::Node on;
681 /// NewGraph::Node nn;
683 /// // Executions of copy
686 template <typename To, typename From>
690 typedef typename From::Node Node;
691 typedef typename From::NodeIt NodeIt;
692 typedef typename From::Arc Arc;
693 typedef typename From::ArcIt ArcIt;
695 typedef typename To::Node TNode;
696 typedef typename To::Arc TArc;
698 typedef typename From::template NodeMap<TNode> NodeRefMap;
699 typedef typename From::template ArcMap<TArc> ArcRefMap;
705 /// \brief Constructor for the DigraphCopy.
707 /// It copies the content of the \c _from digraph into the
709 DigraphCopy(To& to, const From& from)
710 : _from(from), _to(to) {}
712 /// \brief Destructor of the DigraphCopy
714 /// Destructor of the DigraphCopy
716 for (int i = 0; i < int(_node_maps.size()); ++i) {
717 delete _node_maps[i];
719 for (int i = 0; i < int(_arc_maps.size()); ++i) {
725 /// \brief Copies the node references into the given map.
727 /// Copies the node references into the given map. The parameter
728 /// should be a map, which key type is the Node type of the source
729 /// graph, while the value type is the Node type of the
730 /// destination graph.
731 template <typename NodeRef>
732 DigraphCopy& nodeRef(NodeRef& map) {
733 _node_maps.push_back(new _graph_utils_bits::RefCopy<From, Node,
734 NodeRefMap, NodeRef>(map));
738 /// \brief Copies the node cross references into the given map.
740 /// Copies the node cross references (reverse references) into
741 /// the given map. The parameter should be a map, which key type
742 /// is the Node type of the destination graph, while the value type is
743 /// the Node type of the source graph.
744 template <typename NodeCrossRef>
745 DigraphCopy& nodeCrossRef(NodeCrossRef& map) {
746 _node_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
747 NodeRefMap, NodeCrossRef>(map));
751 /// \brief Make copy of the given map.
753 /// Makes copy of the given map for the newly created digraph.
754 /// The new map's key type is the destination graph's node type,
755 /// and the copied map's key type is the source graph's node type.
756 template <typename ToMap, typename FromMap>
757 DigraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
758 _node_maps.push_back(new _graph_utils_bits::MapCopy<From, Node,
759 NodeRefMap, ToMap, FromMap>(tmap, map));
763 /// \brief Make a copy of the given node.
765 /// Make a copy of the given node.
766 DigraphCopy& node(TNode& tnode, const Node& snode) {
767 _node_maps.push_back(new _graph_utils_bits::ItemCopy<From, Node,
768 NodeRefMap, TNode>(tnode, snode));
772 /// \brief Copies the arc references into the given map.
774 /// Copies the arc references into the given map.
775 template <typename ArcRef>
776 DigraphCopy& arcRef(ArcRef& map) {
777 _arc_maps.push_back(new _graph_utils_bits::RefCopy<From, Arc,
778 ArcRefMap, ArcRef>(map));
782 /// \brief Copies the arc cross references into the given map.
784 /// Copies the arc cross references (reverse references) into
786 template <typename ArcCrossRef>
787 DigraphCopy& arcCrossRef(ArcCrossRef& map) {
788 _arc_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Arc,
789 ArcRefMap, ArcCrossRef>(map));
793 /// \brief Make copy of the given map.
795 /// Makes copy of the given map for the newly created digraph.
796 /// The new map's key type is the to digraph's arc type,
797 /// and the copied map's key type is the from digraph's arc
799 template <typename ToMap, typename FromMap>
800 DigraphCopy& arcMap(ToMap& tmap, const FromMap& map) {
801 _arc_maps.push_back(new _graph_utils_bits::MapCopy<From, Arc,
802 ArcRefMap, ToMap, FromMap>(tmap, map));
806 /// \brief Make a copy of the given arc.
808 /// Make a copy of the given arc.
809 DigraphCopy& arc(TArc& tarc, const Arc& sarc) {
810 _arc_maps.push_back(new _graph_utils_bits::ItemCopy<From, Arc,
811 ArcRefMap, TArc>(tarc, sarc));
815 /// \brief Executes the copies.
817 /// Executes the copies.
819 NodeRefMap nodeRefMap(_from);
820 ArcRefMap arcRefMap(_from);
821 _graph_utils_bits::DigraphCopySelector<To>::
822 copy(_to, _from, nodeRefMap, arcRefMap);
823 for (int i = 0; i < int(_node_maps.size()); ++i) {
824 _node_maps[i]->copy(_from, nodeRefMap);
826 for (int i = 0; i < int(_arc_maps.size()); ++i) {
827 _arc_maps[i]->copy(_from, arcRefMap);
837 std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* >
840 std::vector<_graph_utils_bits::MapCopyBase<From, Arc, ArcRefMap>* >
845 /// \brief Copy a digraph to another digraph.
847 /// Copy a digraph to another digraph. The complete usage of the
848 /// function is detailed in the DigraphCopy class, but a short
849 /// example shows a basic work:
851 /// copyDigraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run();
854 /// After the copy the \c nr map will contain the mapping from the
855 /// nodes of the \c from digraph to the nodes of the \c to digraph and
856 /// \c ecr will contain the mapping from the arcs of the \c to digraph
857 /// to the arcs of the \c from digraph.
860 template <typename To, typename From>
861 DigraphCopy<To, From> copyDigraph(To& to, const From& from) {
862 return DigraphCopy<To, From>(to, from);
865 /// \brief Class to copy a graph.
867 /// Class to copy a graph to another graph (duplicate a graph). The
868 /// simplest way of using it is through the \c copyGraph() function.
870 /// This class not just make a copy of a graph, but it can create
871 /// references and cross references between the nodes, edges and arcs of
872 /// the two graphs, it can copy maps for use with the newly created
873 /// graph and copy nodes, edges and arcs.
875 /// To make a copy from a graph, first an instance of GraphCopy
876 /// should be created, then the data belongs to the graph should
877 /// assigned to copy. In the end, the \c run() member should be
880 /// The next code copies a graph with several data:
882 /// GraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph);
883 /// // create a reference for the nodes
884 /// OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
886 /// // create a cross reference (inverse) for the edges
887 /// NewGraph::EdgeMap<OrigGraph::Arc> ecr(new_graph);
888 /// dc.edgeCrossRef(ecr);
889 /// // copy an arc map
890 /// OrigGraph::ArcMap<double> oamap(orig_graph);
891 /// NewGraph::ArcMap<double> namap(new_graph);
892 /// dc.arcMap(namap, oamap);
894 /// OrigGraph::Node on;
895 /// NewGraph::Node nn;
897 /// // Executions of copy
900 template <typename To, typename From>
904 typedef typename From::Node Node;
905 typedef typename From::NodeIt NodeIt;
906 typedef typename From::Arc Arc;
907 typedef typename From::ArcIt ArcIt;
908 typedef typename From::Edge Edge;
909 typedef typename From::EdgeIt EdgeIt;
911 typedef typename To::Node TNode;
912 typedef typename To::Arc TArc;
913 typedef typename To::Edge TEdge;
915 typedef typename From::template NodeMap<TNode> NodeRefMap;
916 typedef typename From::template EdgeMap<TEdge> EdgeRefMap;
919 ArcRefMap(const To& to, const From& from,
920 const EdgeRefMap& edge_ref, const NodeRefMap& node_ref)
921 : _to(to), _from(from),
922 _edge_ref(edge_ref), _node_ref(node_ref) {}
924 typedef typename From::Arc Key;
925 typedef typename To::Arc Value;
927 Value operator[](const Key& key) const {
929 (_from.direction(key) ==
930 (_node_ref[_from.source(key)] == _to.source(_edge_ref[key])));
931 return _to.direct(_edge_ref[key], forward);
936 const EdgeRefMap& _edge_ref;
937 const NodeRefMap& _node_ref;
944 /// \brief Constructor for the GraphCopy.
946 /// It copies the content of the \c _from graph into the
948 GraphCopy(To& to, const From& from)
949 : _from(from), _to(to) {}
951 /// \brief Destructor of the GraphCopy
953 /// Destructor of the GraphCopy
955 for (int i = 0; i < int(_node_maps.size()); ++i) {
956 delete _node_maps[i];
958 for (int i = 0; i < int(_arc_maps.size()); ++i) {
961 for (int i = 0; i < int(_edge_maps.size()); ++i) {
962 delete _edge_maps[i];
967 /// \brief Copies the node references into the given map.
969 /// Copies the node references into the given map.
970 template <typename NodeRef>
971 GraphCopy& nodeRef(NodeRef& map) {
972 _node_maps.push_back(new _graph_utils_bits::RefCopy<From, Node,
973 NodeRefMap, NodeRef>(map));
977 /// \brief Copies the node cross references into the given map.
979 /// Copies the node cross references (reverse references) into
981 template <typename NodeCrossRef>
982 GraphCopy& nodeCrossRef(NodeCrossRef& map) {
983 _node_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
984 NodeRefMap, NodeCrossRef>(map));
988 /// \brief Make copy of the given map.
990 /// Makes copy of the given map for the newly created graph.
991 /// The new map's key type is the to graph's node type,
992 /// and the copied map's key type is the from graph's node
994 template <typename ToMap, typename FromMap>
995 GraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
996 _node_maps.push_back(new _graph_utils_bits::MapCopy<From, Node,
997 NodeRefMap, ToMap, FromMap>(tmap, map));
1001 /// \brief Make a copy of the given node.
1003 /// Make a copy of the given node.
1004 GraphCopy& node(TNode& tnode, const Node& snode) {
1005 _node_maps.push_back(new _graph_utils_bits::ItemCopy<From, Node,
1006 NodeRefMap, TNode>(tnode, snode));
1010 /// \brief Copies the arc references into the given map.
1012 /// Copies the arc references into the given map.
1013 template <typename ArcRef>
1014 GraphCopy& arcRef(ArcRef& map) {
1015 _arc_maps.push_back(new _graph_utils_bits::RefCopy<From, Arc,
1016 ArcRefMap, ArcRef>(map));
1020 /// \brief Copies the arc cross references into the given map.
1022 /// Copies the arc cross references (reverse references) into
1024 template <typename ArcCrossRef>
1025 GraphCopy& arcCrossRef(ArcCrossRef& map) {
1026 _arc_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Arc,
1027 ArcRefMap, ArcCrossRef>(map));
1031 /// \brief Make copy of the given map.
1033 /// Makes copy of the given map for the newly created graph.
1034 /// The new map's key type is the to graph's arc type,
1035 /// and the copied map's key type is the from graph's arc
1037 template <typename ToMap, typename FromMap>
1038 GraphCopy& arcMap(ToMap& tmap, const FromMap& map) {
1039 _arc_maps.push_back(new _graph_utils_bits::MapCopy<From, Arc,
1040 ArcRefMap, ToMap, FromMap>(tmap, map));
1044 /// \brief Make a copy of the given arc.
1046 /// Make a copy of the given arc.
1047 GraphCopy& arc(TArc& tarc, const Arc& sarc) {
1048 _arc_maps.push_back(new _graph_utils_bits::ItemCopy<From, Arc,
1049 ArcRefMap, TArc>(tarc, sarc));
1053 /// \brief Copies the edge references into the given map.
1055 /// Copies the edge references into the given map.
1056 template <typename EdgeRef>
1057 GraphCopy& edgeRef(EdgeRef& map) {
1058 _edge_maps.push_back(new _graph_utils_bits::RefCopy<From, Edge,
1059 EdgeRefMap, EdgeRef>(map));
1063 /// \brief Copies the edge cross references into the given map.
1065 /// Copies the edge cross references (reverse
1066 /// references) into the given map.
1067 template <typename EdgeCrossRef>
1068 GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
1069 _edge_maps.push_back(new _graph_utils_bits::CrossRefCopy<From,
1070 Edge, EdgeRefMap, EdgeCrossRef>(map));
1074 /// \brief Make copy of the given map.
1076 /// Makes copy of the given map for the newly created graph.
1077 /// The new map's key type is the to graph's edge type,
1078 /// and the copied map's key type is the from graph's edge
1080 template <typename ToMap, typename FromMap>
1081 GraphCopy& edgeMap(ToMap& tmap, const FromMap& map) {
1082 _edge_maps.push_back(new _graph_utils_bits::MapCopy<From, Edge,
1083 EdgeRefMap, ToMap, FromMap>(tmap, map));
1087 /// \brief Make a copy of the given edge.
1089 /// Make a copy of the given edge.
1090 GraphCopy& edge(TEdge& tedge, const Edge& sedge) {
1091 _edge_maps.push_back(new _graph_utils_bits::ItemCopy<From, Edge,
1092 EdgeRefMap, TEdge>(tedge, sedge));
1096 /// \brief Executes the copies.
1098 /// Executes the copies.
1100 NodeRefMap nodeRefMap(_from);
1101 EdgeRefMap edgeRefMap(_from);
1102 ArcRefMap arcRefMap(_to, _from, edgeRefMap, nodeRefMap);
1103 _graph_utils_bits::GraphCopySelector<To>::
1104 copy(_to, _from, nodeRefMap, edgeRefMap);
1105 for (int i = 0; i < int(_node_maps.size()); ++i) {
1106 _node_maps[i]->copy(_from, nodeRefMap);
1108 for (int i = 0; i < int(_edge_maps.size()); ++i) {
1109 _edge_maps[i]->copy(_from, edgeRefMap);
1111 for (int i = 0; i < int(_arc_maps.size()); ++i) {
1112 _arc_maps[i]->copy(_from, arcRefMap);
1121 std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* >
1124 std::vector<_graph_utils_bits::MapCopyBase<From, Arc, ArcRefMap>* >
1127 std::vector<_graph_utils_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
1132 /// \brief Copy a graph to another graph.
1134 /// Copy a graph to another graph. The complete usage of the
1135 /// function is detailed in the GraphCopy class, but a short
1136 /// example shows a basic work:
1138 /// copyGraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run();
1141 /// After the copy the \c nr map will contain the mapping from the
1142 /// nodes of the \c from graph to the nodes of the \c to graph and
1143 /// \c ecr will contain the mapping from the arcs of the \c to graph
1144 /// to the arcs of the \c from graph.
1147 template <typename To, typename From>
1149 copyGraph(To& to, const From& from) {
1150 return GraphCopy<To, From>(to, from);
1155 /// \addtogroup graph_maps
1158 /// Provides an immutable and unique id for each item in the graph.
1160 /// The IdMap class provides a unique and immutable id for each item of the
1161 /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
1162 /// different items (nodes) get different ids <li>\b immutable: the id of an
1163 /// item (node) does not change (even if you delete other nodes). </ul>
1164 /// Through this map you get access (i.e. can read) the inner id values of
1165 /// the items stored in the graph. This map can be inverted with its member
1166 /// class \c InverseMap or with the \c operator() member.
1168 template <typename _Graph, typename _Item>
1171 typedef _Graph Graph;
1176 /// \brief Constructor.
1178 /// Constructor of the map.
1179 explicit IdMap(const Graph& graph) : _graph(&graph) {}
1181 /// \brief Gives back the \e id of the item.
1183 /// Gives back the immutable and unique \e id of the item.
1184 int operator[](const Item& item) const { return _graph->id(item);}
1186 /// \brief Gives back the item by its id.
1188 /// Gives back the item by its id.
1189 Item operator()(int id) { return _graph->fromId(id, Item()); }
1192 const Graph* _graph;
1196 /// \brief The class represents the inverse of its owner (IdMap).
1198 /// The class represents the inverse of its owner (IdMap).
1203 /// \brief Constructor.
1205 /// Constructor for creating an id-to-item map.
1206 explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1208 /// \brief Constructor.
1210 /// Constructor for creating an id-to-item map.
1211 explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1213 /// \brief Gives back the given item from its id.
1215 /// Gives back the given item from its id.
1217 Item operator[](int id) const { return _graph->fromId(id, Item());}
1220 const Graph* _graph;
1223 /// \brief Gives back the inverse of the map.
1225 /// Gives back the inverse of the IdMap.
1226 InverseMap inverse() const { return InverseMap(*_graph);}
1231 /// \brief General invertable graph-map type.
1233 /// This type provides simple invertable graph-maps.
1234 /// The InvertableMap wraps an arbitrary ReadWriteMap
1235 /// and if a key is set to a new value then store it
1236 /// in the inverse map.
1238 /// The values of the map can be accessed
1239 /// with stl compatible forward iterator.
1241 /// \tparam _Graph The graph type.
1242 /// \tparam _Item The item type of the graph.
1243 /// \tparam _Value The value type of the map.
1245 /// \see IterableValueMap
1246 template <typename _Graph, typename _Item, typename _Value>
1247 class InvertableMap : protected DefaultMap<_Graph, _Item, _Value> {
1250 typedef DefaultMap<_Graph, _Item, _Value> Map;
1251 typedef _Graph Graph;
1253 typedef std::map<_Value, _Item> Container;
1258 /// The key type of InvertableMap (Node, Arc, Edge).
1259 typedef typename Map::Key Key;
1260 /// The value type of the InvertableMap.
1261 typedef typename Map::Value Value;
1265 /// \brief Constructor.
1267 /// Construct a new InvertableMap for the graph.
1269 explicit InvertableMap(const Graph& graph) : Map(graph) {}
1271 /// \brief Forward iterator for values.
1273 /// This iterator is an stl compatible forward
1274 /// iterator on the values of the map. The values can
1275 /// be accessed in the [beginValue, endValue) range.
1278 : public std::iterator<std::forward_iterator_tag, Value> {
1279 friend class InvertableMap;
1281 ValueIterator(typename Container::const_iterator _it)
1287 ValueIterator& operator++() { ++it; return *this; }
1288 ValueIterator operator++(int) {
1289 ValueIterator tmp(*this);
1294 const Value& operator*() const { return it->first; }
1295 const Value* operator->() const { return &(it->first); }
1297 bool operator==(ValueIterator jt) const { return it == jt.it; }
1298 bool operator!=(ValueIterator jt) const { return it != jt.it; }
1301 typename Container::const_iterator it;
1304 /// \brief Returns an iterator to the first value.
1306 /// Returns an stl compatible iterator to the
1307 /// first value of the map. The values of the
1308 /// map can be accessed in the [beginValue, endValue)
1310 ValueIterator beginValue() const {
1311 return ValueIterator(_inv_map.begin());
1314 /// \brief Returns an iterator after the last value.
1316 /// Returns an stl compatible iterator after the
1317 /// last value of the map. The values of the
1318 /// map can be accessed in the [beginValue, endValue)
1320 ValueIterator endValue() const {
1321 return ValueIterator(_inv_map.end());
1324 /// \brief The setter function of the map.
1326 /// Sets the mapped value.
1327 void set(const Key& key, const Value& val) {
1328 Value oldval = Map::operator[](key);
1329 typename Container::iterator it = _inv_map.find(oldval);
1330 if (it != _inv_map.end() && it->second == key) {
1333 _inv_map.insert(make_pair(val, key));
1337 /// \brief The getter function of the map.
1339 /// It gives back the value associated with the key.
1340 typename MapTraits<Map>::ConstReturnValue
1341 operator[](const Key& key) const {
1342 return Map::operator[](key);
1345 /// \brief Gives back the item by its value.
1347 /// Gives back the item by its value.
1348 Key operator()(const Value& key) const {
1349 typename Container::const_iterator it = _inv_map.find(key);
1350 return it != _inv_map.end() ? it->second : INVALID;
1355 /// \brief Erase the key from the map.
1357 /// Erase the key to the map. It is called by the
1358 /// \c AlterationNotifier.
1359 virtual void erase(const Key& key) {
1360 Value val = Map::operator[](key);
1361 typename Container::iterator it = _inv_map.find(val);
1362 if (it != _inv_map.end() && it->second == key) {
1368 /// \brief Erase more keys from the map.
1370 /// Erase more keys from the map. It is called by the
1371 /// \c AlterationNotifier.
1372 virtual void erase(const std::vector<Key>& keys) {
1373 for (int i = 0; i < int(keys.size()); ++i) {
1374 Value val = Map::operator[](keys[i]);
1375 typename Container::iterator it = _inv_map.find(val);
1376 if (it != _inv_map.end() && it->second == keys[i]) {
1383 /// \brief Clear the keys from the map and inverse map.
1385 /// Clear the keys from the map and inverse map. It is called by the
1386 /// \c AlterationNotifier.
1387 virtual void clear() {
1394 /// \brief The inverse map type.
1396 /// The inverse of this map. The subscript operator of the map
1397 /// gives back always the item what was last assigned to the value.
1400 /// \brief Constructor of the InverseMap.
1402 /// Constructor of the InverseMap.
1403 explicit InverseMap(const InvertableMap& inverted)
1404 : _inverted(inverted) {}
1406 /// The value type of the InverseMap.
1407 typedef typename InvertableMap::Key Value;
1408 /// The key type of the InverseMap.
1409 typedef typename InvertableMap::Value Key;
1411 /// \brief Subscript operator.
1413 /// Subscript operator. It gives back always the item
1414 /// what was last assigned to the value.
1415 Value operator[](const Key& key) const {
1416 return _inverted(key);
1420 const InvertableMap& _inverted;
1423 /// \brief It gives back the just readable inverse map.
1425 /// It gives back the just readable inverse map.
1426 InverseMap inverse() const {
1427 return InverseMap(*this);
1434 /// \brief Provides a mutable, continuous and unique descriptor for each
1435 /// item in the graph.
1437 /// The DescriptorMap class provides a unique and continuous (but mutable)
1438 /// descriptor (id) for each item of the same type (e.g. node) in the
1439 /// graph. This id is <ul><li>\b unique: different items (nodes) get
1440 /// different ids <li>\b continuous: the range of the ids is the set of
1441 /// integers between 0 and \c n-1, where \c n is the number of the items of
1442 /// this type (e.g. nodes) (so the id of a node can change if you delete an
1443 /// other node, i.e. this id is mutable). </ul> This map can be inverted
1444 /// with its member class \c InverseMap, or with the \c operator() member.
1446 /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
1447 /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or
1449 template <typename _Graph, typename _Item>
1450 class DescriptorMap : protected DefaultMap<_Graph, _Item, int> {
1453 typedef DefaultMap<_Graph, _Item, int> Map;
1456 /// The graph class of DescriptorMap.
1457 typedef _Graph Graph;
1459 /// The key type of DescriptorMap (Node, Arc, Edge).
1460 typedef typename Map::Key Key;
1461 /// The value type of DescriptorMap.
1462 typedef typename Map::Value Value;
1464 /// \brief Constructor.
1466 /// Constructor for descriptor map.
1467 explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
1469 const typename Map::Notifier* nf = Map::notifier();
1470 for (nf->first(it); it != INVALID; nf->next(it)) {
1471 Map::set(it, _inv_map.size());
1472 _inv_map.push_back(it);
1478 /// \brief Add a new key to the map.
1480 /// Add a new key to the map. It is called by the
1481 /// \c AlterationNotifier.
1482 virtual void add(const Item& item) {
1484 Map::set(item, _inv_map.size());
1485 _inv_map.push_back(item);
1488 /// \brief Add more new keys to the map.
1490 /// Add more new keys to the map. It is called by the
1491 /// \c AlterationNotifier.
1492 virtual void add(const std::vector<Item>& items) {
1494 for (int i = 0; i < int(items.size()); ++i) {
1495 Map::set(items[i], _inv_map.size());
1496 _inv_map.push_back(items[i]);
1500 /// \brief Erase the key from the map.
1502 /// Erase the key from the map. It is called by the
1503 /// \c AlterationNotifier.
1504 virtual void erase(const Item& item) {
1505 Map::set(_inv_map.back(), Map::operator[](item));
1506 _inv_map[Map::operator[](item)] = _inv_map.back();
1507 _inv_map.pop_back();
1511 /// \brief Erase more keys from the map.
1513 /// Erase more keys from the map. It is called by the
1514 /// \c AlterationNotifier.
1515 virtual void erase(const std::vector<Item>& items) {
1516 for (int i = 0; i < int(items.size()); ++i) {
1517 Map::set(_inv_map.back(), Map::operator[](items[i]));
1518 _inv_map[Map::operator[](items[i])] = _inv_map.back();
1519 _inv_map.pop_back();
1524 /// \brief Build the unique map.
1526 /// Build the unique map. It is called by the
1527 /// \c AlterationNotifier.
1528 virtual void build() {
1531 const typename Map::Notifier* nf = Map::notifier();
1532 for (nf->first(it); it != INVALID; nf->next(it)) {
1533 Map::set(it, _inv_map.size());
1534 _inv_map.push_back(it);
1538 /// \brief Clear the keys from the map.
1540 /// Clear the keys from the map. It is called by the
1541 /// \c AlterationNotifier.
1542 virtual void clear() {
1549 /// \brief Returns the maximal value plus one.
1551 /// Returns the maximal value plus one in the map.
1552 unsigned int size() const {
1553 return _inv_map.size();
1556 /// \brief Swaps the position of the two items in the map.
1558 /// Swaps the position of the two items in the map.
1559 void swap(const Item& p, const Item& q) {
1560 int pi = Map::operator[](p);
1561 int qi = Map::operator[](q);
1568 /// \brief Gives back the \e descriptor of the item.
1570 /// Gives back the mutable and unique \e descriptor of the map.
1571 int operator[](const Item& item) const {
1572 return Map::operator[](item);
1575 /// \brief Gives back the item by its descriptor.
1577 /// Gives back th item by its descriptor.
1578 Item operator()(int id) const {
1579 return _inv_map[id];
1584 typedef std::vector<Item> Container;
1588 /// \brief The inverse map type of DescriptorMap.
1590 /// The inverse map type of DescriptorMap.
1593 /// \brief Constructor of the InverseMap.
1595 /// Constructor of the InverseMap.
1596 explicit InverseMap(const DescriptorMap& inverted)
1597 : _inverted(inverted) {}
1600 /// The value type of the InverseMap.
1601 typedef typename DescriptorMap::Key Value;
1602 /// The key type of the InverseMap.
1603 typedef typename DescriptorMap::Value Key;
1605 /// \brief Subscript operator.
1607 /// Subscript operator. It gives back the item
1608 /// that the descriptor belongs to currently.
1609 Value operator[](const Key& key) const {
1610 return _inverted(key);
1613 /// \brief Size of the map.
1615 /// Returns the size of the map.
1616 unsigned int size() const {
1617 return _inverted.size();
1621 const DescriptorMap& _inverted;
1624 /// \brief Gives back the inverse of the map.
1626 /// Gives back the inverse of the map.
1627 const InverseMap inverse() const {
1628 return InverseMap(*this);
1632 /// \brief Returns the source of the given arc.
1634 /// The SourceMap gives back the source Node of the given arc.
1636 template <typename Digraph>
1640 typedef typename Digraph::Node Value;
1641 typedef typename Digraph::Arc Key;
1643 /// \brief Constructor
1646 /// \param _digraph The digraph that the map belongs to.
1647 explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
1649 /// \brief The subscript operator.
1651 /// The subscript operator.
1652 /// \param arc The arc
1653 /// \return The source of the arc
1654 Value operator[](const Key& arc) const {
1655 return _digraph.source(arc);
1659 const Digraph& _digraph;
1662 /// \brief Returns a \ref SourceMap class.
1664 /// This function just returns an \ref SourceMap class.
1665 /// \relates SourceMap
1666 template <typename Digraph>
1667 inline SourceMap<Digraph> sourceMap(const Digraph& digraph) {
1668 return SourceMap<Digraph>(digraph);
1671 /// \brief Returns the target of the given arc.
1673 /// The TargetMap gives back the target Node of the given arc.
1675 template <typename Digraph>
1679 typedef typename Digraph::Node Value;
1680 typedef typename Digraph::Arc Key;
1682 /// \brief Constructor
1685 /// \param _digraph The digraph that the map belongs to.
1686 explicit TargetMap(const Digraph& digraph) : _digraph(digraph) {}
1688 /// \brief The subscript operator.
1690 /// The subscript operator.
1691 /// \param e The arc
1692 /// \return The target of the arc
1693 Value operator[](const Key& e) const {
1694 return _digraph.target(e);
1698 const Digraph& _digraph;
1701 /// \brief Returns a \ref TargetMap class.
1703 /// This function just returns a \ref TargetMap class.
1704 /// \relates TargetMap
1705 template <typename Digraph>
1706 inline TargetMap<Digraph> targetMap(const Digraph& digraph) {
1707 return TargetMap<Digraph>(digraph);
1710 /// \brief Returns the "forward" directed arc view of an edge.
1712 /// Returns the "forward" directed arc view of an edge.
1713 /// \see BackwardMap
1714 template <typename Graph>
1718 typedef typename Graph::Arc Value;
1719 typedef typename Graph::Edge Key;
1721 /// \brief Constructor
1724 /// \param _graph The graph that the map belongs to.
1725 explicit ForwardMap(const Graph& graph) : _graph(graph) {}
1727 /// \brief The subscript operator.
1729 /// The subscript operator.
1730 /// \param key An edge
1731 /// \return The "forward" directed arc view of edge
1732 Value operator[](const Key& key) const {
1733 return _graph.direct(key, true);
1737 const Graph& _graph;
1740 /// \brief Returns a \ref ForwardMap class.
1742 /// This function just returns an \ref ForwardMap class.
1743 /// \relates ForwardMap
1744 template <typename Graph>
1745 inline ForwardMap<Graph> forwardMap(const Graph& graph) {
1746 return ForwardMap<Graph>(graph);
1749 /// \brief Returns the "backward" directed arc view of an edge.
1751 /// Returns the "backward" directed arc view of an edge.
1753 template <typename Graph>
1757 typedef typename Graph::Arc Value;
1758 typedef typename Graph::Edge Key;
1760 /// \brief Constructor
1763 /// \param _graph The graph that the map belongs to.
1764 explicit BackwardMap(const Graph& graph) : _graph(graph) {}
1766 /// \brief The subscript operator.
1768 /// The subscript operator.
1769 /// \param key An edge
1770 /// \return The "backward" directed arc view of edge
1771 Value operator[](const Key& key) const {
1772 return _graph.direct(key, false);
1776 const Graph& _graph;
1779 /// \brief Returns a \ref BackwardMap class
1781 /// This function just returns a \ref BackwardMap class.
1782 /// \relates BackwardMap
1783 template <typename Graph>
1784 inline BackwardMap<Graph> backwardMap(const Graph& graph) {
1785 return BackwardMap<Graph>(graph);
1788 /// \brief Potential difference map
1790 /// If there is an potential map on the nodes then we
1791 /// can get an arc map as we get the substraction of the
1792 /// values of the target and source.
1793 template <typename Digraph, typename NodeMap>
1794 class PotentialDifferenceMap {
1796 typedef typename Digraph::Arc Key;
1797 typedef typename NodeMap::Value Value;
1799 /// \brief Constructor
1801 /// Contructor of the map
1802 explicit PotentialDifferenceMap(const Digraph& digraph,
1803 const NodeMap& potential)
1804 : _digraph(digraph), _potential(potential) {}
1806 /// \brief Const subscription operator
1808 /// Const subscription operator
1809 Value operator[](const Key& arc) const {
1810 return _potential[_digraph.target(arc)] -
1811 _potential[_digraph.source(arc)];
1815 const Digraph& _digraph;
1816 const NodeMap& _potential;
1819 /// \brief Returns a PotentialDifferenceMap.
1821 /// This function just returns a PotentialDifferenceMap.
1822 /// \relates PotentialDifferenceMap
1823 template <typename Digraph, typename NodeMap>
1824 PotentialDifferenceMap<Digraph, NodeMap>
1825 potentialDifferenceMap(const Digraph& digraph, const NodeMap& potential) {
1826 return PotentialDifferenceMap<Digraph, NodeMap>(digraph, potential);
1829 /// \brief Map of the node in-degrees.
1831 /// This map returns the in-degree of a node. Once it is constructed,
1832 /// the degrees are stored in a standard NodeMap, so each query is done
1833 /// in constant time. On the other hand, the values are updated automatically
1834 /// whenever the digraph changes.
1836 /// \warning Besides addNode() and addArc(), a digraph structure may provide
1837 /// alternative ways to modify the digraph. The correct behavior of InDegMap
1838 /// is not guarantied if these additional features are used. For example
1839 /// the functions \ref ListDigraph::changeSource() "changeSource()",
1840 /// \ref ListDigraph::changeTarget() "changeTarget()" and
1841 /// \ref ListDigraph::reverseArc() "reverseArc()"
1842 /// of \ref ListDigraph will \e not update the degree values correctly.
1846 template <typename _Digraph>
1848 : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
1849 ::ItemNotifier::ObserverBase {
1853 typedef _Digraph Digraph;
1855 typedef typename Digraph::Node Key;
1857 typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
1858 ::ItemNotifier::ObserverBase Parent;
1862 class AutoNodeMap : public DefaultMap<Digraph, Key, int> {
1865 typedef DefaultMap<Digraph, Key, int> Parent;
1867 AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
1869 virtual void add(const Key& key) {
1871 Parent::set(key, 0);
1874 virtual void add(const std::vector<Key>& keys) {
1876 for (int i = 0; i < int(keys.size()); ++i) {
1877 Parent::set(keys[i], 0);
1881 virtual void build() {
1884 typename Parent::Notifier* nf = Parent::notifier();
1885 for (nf->first(it); it != INVALID; nf->next(it)) {
1893 /// \brief Constructor.
1895 /// Constructor for creating in-degree map.
1896 explicit InDegMap(const Digraph& digraph)
1897 : _digraph(digraph), _deg(digraph) {
1898 Parent::attach(_digraph.notifier(typename Digraph::Arc()));
1900 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1901 _deg[it] = countInArcs(_digraph, it);
1905 /// Gives back the in-degree of a Node.
1906 int operator[](const Key& key) const {
1912 typedef typename Digraph::Arc Arc;
1914 virtual void add(const Arc& arc) {
1915 ++_deg[_digraph.target(arc)];
1918 virtual void add(const std::vector<Arc>& arcs) {
1919 for (int i = 0; i < int(arcs.size()); ++i) {
1920 ++_deg[_digraph.target(arcs[i])];
1924 virtual void erase(const Arc& arc) {
1925 --_deg[_digraph.target(arc)];
1928 virtual void erase(const std::vector<Arc>& arcs) {
1929 for (int i = 0; i < int(arcs.size()); ++i) {
1930 --_deg[_digraph.target(arcs[i])];
1934 virtual void build() {
1935 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1936 _deg[it] = countInArcs(_digraph, it);
1940 virtual void clear() {
1941 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1947 const Digraph& _digraph;
1951 /// \brief Map of the node out-degrees.
1953 /// This map returns the out-degree of a node. Once it is constructed,
1954 /// the degrees are stored in a standard NodeMap, so each query is done
1955 /// in constant time. On the other hand, the values are updated automatically
1956 /// whenever the digraph changes.
1958 /// \warning Besides addNode() and addArc(), a digraph structure may provide
1959 /// alternative ways to modify the digraph. The correct behavior of OutDegMap
1960 /// is not guarantied if these additional features are used. For example
1961 /// the functions \ref ListDigraph::changeSource() "changeSource()",
1962 /// \ref ListDigraph::changeTarget() "changeTarget()" and
1963 /// \ref ListDigraph::reverseArc() "reverseArc()"
1964 /// of \ref ListDigraph will \e not update the degree values correctly.
1968 template <typename _Digraph>
1970 : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
1971 ::ItemNotifier::ObserverBase {
1975 typedef _Digraph Digraph;
1977 typedef typename Digraph::Node Key;
1979 typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
1980 ::ItemNotifier::ObserverBase Parent;
1984 class AutoNodeMap : public DefaultMap<Digraph, Key, int> {
1987 typedef DefaultMap<Digraph, Key, int> Parent;
1989 AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
1991 virtual void add(const Key& key) {
1993 Parent::set(key, 0);
1995 virtual void add(const std::vector<Key>& keys) {
1997 for (int i = 0; i < int(keys.size()); ++i) {
1998 Parent::set(keys[i], 0);
2001 virtual void build() {
2004 typename Parent::Notifier* nf = Parent::notifier();
2005 for (nf->first(it); it != INVALID; nf->next(it)) {
2013 /// \brief Constructor.
2015 /// Constructor for creating out-degree map.
2016 explicit OutDegMap(const Digraph& digraph)
2017 : _digraph(digraph), _deg(digraph) {
2018 Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2020 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2021 _deg[it] = countOutArcs(_digraph, it);
2025 /// Gives back the out-degree of a Node.
2026 int operator[](const Key& key) const {
2032 typedef typename Digraph::Arc Arc;
2034 virtual void add(const Arc& arc) {
2035 ++_deg[_digraph.source(arc)];
2038 virtual void add(const std::vector<Arc>& arcs) {
2039 for (int i = 0; i < int(arcs.size()); ++i) {
2040 ++_deg[_digraph.source(arcs[i])];
2044 virtual void erase(const Arc& arc) {
2045 --_deg[_digraph.source(arc)];
2048 virtual void erase(const std::vector<Arc>& arcs) {
2049 for (int i = 0; i < int(arcs.size()); ++i) {
2050 --_deg[_digraph.source(arcs[i])];
2054 virtual void build() {
2055 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2056 _deg[it] = countOutArcs(_digraph, it);
2060 virtual void clear() {
2061 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2067 const Digraph& _digraph;
2072 ///Dynamic arc look up between given endpoints.
2075 ///Using this class, you can find an arc in a digraph from a given
2076 ///source to a given target in amortized time <em>O(log d)</em>,
2077 ///where <em>d</em> is the out-degree of the source node.
2079 ///It is possible to find \e all parallel arcs between two nodes with
2080 ///the \c findFirst() and \c findNext() members.
2082 ///See the \ref ArcLookUp and \ref AllArcLookUp classes if your
2083 ///digraph is not changed so frequently.
2085 ///This class uses a self-adjusting binary search tree, Sleator's
2086 ///and Tarjan's Splay tree for guarantee the logarithmic amortized
2087 ///time bound for arc lookups. This class also guarantees the
2088 ///optimal time bound in a constant factor for any distribution of
2091 ///\tparam G The type of the underlying digraph.
2097 : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
2100 typedef typename ItemSetTraits<G, typename G::Arc>
2101 ::ItemNotifier::ObserverBase Parent;
2103 TEMPLATE_DIGRAPH_TYPEDEFS(G);
2108 class AutoNodeMap : public DefaultMap<G, Node, Arc> {
2111 typedef DefaultMap<G, Node, Arc> Parent;
2113 AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
2115 virtual void add(const Node& node) {
2117 Parent::set(node, INVALID);
2120 virtual void add(const std::vector<Node>& nodes) {
2122 for (int i = 0; i < int(nodes.size()); ++i) {
2123 Parent::set(nodes[i], INVALID);
2127 virtual void build() {
2130 typename Parent::Notifier* nf = Parent::notifier();
2131 for (nf->first(it); it != INVALID; nf->next(it)) {
2132 Parent::set(it, INVALID);
2139 typename Digraph::template ArcMap<Arc> _parent;
2140 typename Digraph::template ArcMap<Arc> _left;
2141 typename Digraph::template ArcMap<Arc> _right;
2146 ArcLess(const Digraph &_g) : g(_g) {}
2147 bool operator()(Arc a,Arc b) const
2149 return g.target(a)<g.target(b);
2159 ///It builds up the search database.
2160 DynArcLookUp(const Digraph &g)
2161 : _g(g),_head(g),_parent(g),_left(g),_right(g)
2163 Parent::attach(_g.notifier(typename Digraph::Arc()));
2169 virtual void add(const Arc& arc) {
2173 virtual void add(const std::vector<Arc>& arcs) {
2174 for (int i = 0; i < int(arcs.size()); ++i) {
2179 virtual void erase(const Arc& arc) {
2183 virtual void erase(const std::vector<Arc>& arcs) {
2184 for (int i = 0; i < int(arcs.size()); ++i) {
2189 virtual void build() {
2193 virtual void clear() {
2194 for(NodeIt n(_g);n!=INVALID;++n) {
2195 _head.set(n, INVALID);
2199 void insert(Arc arc) {
2200 Node s = _g.source(arc);
2201 Node t = _g.target(arc);
2202 _left.set(arc, INVALID);
2203 _right.set(arc, INVALID);
2208 _parent.set(arc, INVALID);
2212 if (t < _g.target(e)) {
2213 if (_left[e] == INVALID) {
2215 _parent.set(arc, e);
2222 if (_right[e] == INVALID) {
2224 _parent.set(arc, e);
2234 void remove(Arc arc) {
2235 if (_left[arc] == INVALID) {
2236 if (_right[arc] != INVALID) {
2237 _parent.set(_right[arc], _parent[arc]);
2239 if (_parent[arc] != INVALID) {
2240 if (_left[_parent[arc]] == arc) {
2241 _left.set(_parent[arc], _right[arc]);
2243 _right.set(_parent[arc], _right[arc]);
2246 _head.set(_g.source(arc), _right[arc]);
2248 } else if (_right[arc] == INVALID) {
2249 _parent.set(_left[arc], _parent[arc]);
2250 if (_parent[arc] != INVALID) {
2251 if (_left[_parent[arc]] == arc) {
2252 _left.set(_parent[arc], _left[arc]);
2254 _right.set(_parent[arc], _left[arc]);
2257 _head.set(_g.source(arc), _left[arc]);
2261 if (_right[e] != INVALID) {
2263 while (_right[e] != INVALID) {
2267 _right.set(_parent[e], _left[e]);
2268 if (_left[e] != INVALID) {
2269 _parent.set(_left[e], _parent[e]);
2272 _left.set(e, _left[arc]);
2273 _parent.set(_left[arc], e);
2274 _right.set(e, _right[arc]);
2275 _parent.set(_right[arc], e);
2277 _parent.set(e, _parent[arc]);
2278 if (_parent[arc] != INVALID) {
2279 if (_left[_parent[arc]] == arc) {
2280 _left.set(_parent[arc], e);
2282 _right.set(_parent[arc], e);
2287 _right.set(e, _right[arc]);
2288 _parent.set(_right[arc], e);
2290 if (_parent[arc] != INVALID) {
2291 if (_left[_parent[arc]] == arc) {
2292 _left.set(_parent[arc], e);
2294 _right.set(_parent[arc], e);
2297 _head.set(_g.source(arc), e);
2303 Arc refreshRec(std::vector<Arc> &v,int a,int b)
2308 Arc left = refreshRec(v,a,m-1);
2309 _left.set(me, left);
2310 _parent.set(left, me);
2312 _left.set(me, INVALID);
2315 Arc right = refreshRec(v,m+1,b);
2316 _right.set(me, right);
2317 _parent.set(right, me);
2319 _right.set(me, INVALID);
2325 for(NodeIt n(_g);n!=INVALID;++n) {
2327 for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
2329 std::sort(v.begin(),v.end(),ArcLess(_g));
2330 Arc head = refreshRec(v,0,v.size()-1);
2332 _parent.set(head, INVALID);
2334 else _head.set(n, INVALID);
2340 _parent.set(v, _parent[w]);
2342 _left.set(w, _right[v]);
2344 if (_parent[v] != INVALID) {
2345 if (_right[_parent[v]] == w) {
2346 _right.set(_parent[v], v);
2348 _left.set(_parent[v], v);
2351 if (_left[w] != INVALID){
2352 _parent.set(_left[w], w);
2358 _parent.set(v, _parent[w]);
2360 _right.set(w, _left[v]);
2362 if (_parent[v] != INVALID){
2363 if (_left[_parent[v]] == w) {
2364 _left.set(_parent[v], v);
2366 _right.set(_parent[v], v);
2369 if (_right[w] != INVALID){
2370 _parent.set(_right[w], w);
2375 while (_parent[v] != INVALID) {
2376 if (v == _left[_parent[v]]) {
2377 if (_parent[_parent[v]] == INVALID) {
2380 if (_parent[v] == _left[_parent[_parent[v]]]) {
2389 if (_parent[_parent[v]] == INVALID) {
2392 if (_parent[v] == _left[_parent[_parent[v]]]) {
2402 _head[_g.source(v)] = v;
2408 ///Find an arc between two nodes.
2410 ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
2411 /// <em>d</em> is the number of outgoing arcs of \c s.
2412 ///\param s The source node
2413 ///\param t The target node
2414 ///\return An arc from \c s to \c t if there exists,
2415 ///\ref INVALID otherwise.
2416 Arc operator()(Node s, Node t) const
2420 if (_g.target(a) == t) {
2421 const_cast<DynArcLookUp&>(*this).splay(a);
2423 } else if (t < _g.target(a)) {
2424 if (_left[a] == INVALID) {
2425 const_cast<DynArcLookUp&>(*this).splay(a);
2431 if (_right[a] == INVALID) {
2432 const_cast<DynArcLookUp&>(*this).splay(a);
2441 ///Find the first arc between two nodes.
2443 ///Find the first arc between two nodes in time
2444 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2445 /// outgoing arcs of \c s.
2446 ///\param s The source node
2447 ///\param t The target node
2448 ///\return An arc from \c s to \c t if there exists, \ref INVALID
2450 Arc findFirst(Node s, Node t) const
2455 if (_g.target(a) < t) {
2456 if (_right[a] == INVALID) {
2457 const_cast<DynArcLookUp&>(*this).splay(a);
2463 if (_g.target(a) == t) {
2466 if (_left[a] == INVALID) {
2467 const_cast<DynArcLookUp&>(*this).splay(a);
2476 ///Find the next arc between two nodes.
2478 ///Find the next arc between two nodes in time
2479 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2480 /// outgoing arcs of \c s.
2481 ///\param s The source node
2482 ///\param t The target node
2483 ///\return An arc from \c s to \c t if there exists, \ref INVALID
2486 ///\note If \c e is not the result of the previous \c findFirst()
2487 ///operation then the amorized time bound can not be guaranteed.
2489 Arc findNext(Node s, Node t, Arc a) const
2491 Arc findNext(Node, Node t, Arc a) const
2494 if (_right[a] != INVALID) {
2496 while (_left[a] != INVALID) {
2499 const_cast<DynArcLookUp&>(*this).splay(a);
2501 while (_parent[a] != INVALID && _right[_parent[a]] == a) {
2504 if (_parent[a] == INVALID) {
2508 const_cast<DynArcLookUp&>(*this).splay(a);
2511 if (_g.target(a) == t) return a;
2512 else return INVALID;
2517 ///Fast arc look up between given endpoints.
2520 ///Using this class, you can find an arc in a digraph from a given
2521 ///source to a given target in time <em>O(log d)</em>,
2522 ///where <em>d</em> is the out-degree of the source node.
2524 ///It is not possible to find \e all parallel arcs between two nodes.
2525 ///Use \ref AllArcLookUp for this purpose.
2527 ///\warning This class is static, so you should refresh() (or at least
2528 ///refresh(Node)) this data structure
2529 ///whenever the digraph changes. This is a time consuming (superlinearly
2530 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2532 ///\tparam G The type of the underlying digraph.
2540 TEMPLATE_DIGRAPH_TYPEDEFS(G);
2545 typename Digraph::template NodeMap<Arc> _head;
2546 typename Digraph::template ArcMap<Arc> _left;
2547 typename Digraph::template ArcMap<Arc> _right;
2552 ArcLess(const Digraph &_g) : g(_g) {}
2553 bool operator()(Arc a,Arc b) const
2555 return g.target(a)<g.target(b);
2565 ///It builds up the search database, which remains valid until the digraph
2567 ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
2570 Arc refreshRec(std::vector<Arc> &v,int a,int b)
2574 _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
2575 _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
2579 ///Refresh the data structure at a node.
2581 ///Build up the search database of node \c n.
2583 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
2584 ///the number of the outgoing arcs of \c n.
2585 void refresh(Node n)
2588 for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
2590 std::sort(v.begin(),v.end(),ArcLess(_g));
2591 _head[n]=refreshRec(v,0,v.size()-1);
2593 else _head[n]=INVALID;
2595 ///Refresh the full data structure.
2597 ///Build up the full search database. In fact, it simply calls
2598 ///\ref refresh(Node) "refresh(n)" for each node \c n.
2600 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
2601 ///the number of the arcs of \c n and <em>D</em> is the maximum
2602 ///out-degree of the digraph.
2606 for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
2609 ///Find an arc between two nodes.
2611 ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
2612 /// <em>d</em> is the number of outgoing arcs of \c s.
2613 ///\param s The source node
2614 ///\param t The target node
2615 ///\return An arc from \c s to \c t if there exists,
2616 ///\ref INVALID otherwise.
2618 ///\warning If you change the digraph, refresh() must be called before using
2619 ///this operator. If you change the outgoing arcs of
2620 ///a single node \c n, then
2621 ///\ref refresh(Node) "refresh(n)" is enough.
2623 Arc operator()(Node s, Node t) const
2627 e!=INVALID&&_g.target(e)!=t;
2628 e = t < _g.target(e)?_left[e]:_right[e]) ;
2634 ///Fast look up of all arcs between given endpoints.
2637 ///This class is the same as \ref ArcLookUp, with the addition
2638 ///that it makes it possible to find all arcs between given endpoints.
2640 ///\warning This class is static, so you should refresh() (or at least
2641 ///refresh(Node)) this data structure
2642 ///whenever the digraph changes. This is a time consuming (superlinearly
2643 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2645 ///\tparam G The type of the underlying digraph.
2650 class AllArcLookUp : public ArcLookUp<G>
2652 using ArcLookUp<G>::_g;
2653 using ArcLookUp<G>::_right;
2654 using ArcLookUp<G>::_left;
2655 using ArcLookUp<G>::_head;
2657 TEMPLATE_DIGRAPH_TYPEDEFS(G);
2660 typename Digraph::template ArcMap<Arc> _next;
2662 Arc refreshNext(Arc head,Arc next=INVALID)
2664 if(head==INVALID) return next;
2666 next=refreshNext(_right[head],next);
2667 // _next[head]=next;
2668 _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
2670 return refreshNext(_left[head],head);
2676 for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
2684 ///It builds up the search database, which remains valid until the digraph
2686 AllArcLookUp(const Digraph &g) : ArcLookUp<G>(g), _next(g) {refreshNext();}
2688 ///Refresh the data structure at a node.
2690 ///Build up the search database of node \c n.
2692 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
2693 ///the number of the outgoing arcs of \c n.
2695 void refresh(Node n)
2697 ArcLookUp<G>::refresh(n);
2698 refreshNext(_head[n]);
2701 ///Refresh the full data structure.
2703 ///Build up the full search database. In fact, it simply calls
2704 ///\ref refresh(Node) "refresh(n)" for each node \c n.
2706 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
2707 ///the number of the arcs of \c n and <em>D</em> is the maximum
2708 ///out-degree of the digraph.
2712 for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
2715 ///Find an arc between two nodes.
2717 ///Find an arc between two nodes.
2718 ///\param s The source node
2719 ///\param t The target node
2720 ///\param prev The previous arc between \c s and \c t. It it is INVALID or
2721 ///not given, the operator finds the first appropriate arc.
2722 ///\return An arc from \c s to \c t after \c prev or
2723 ///\ref INVALID if there is no more.
2725 ///For example, you can count the number of arcs from \c u to \c v in the
2728 ///AllArcLookUp<ListDigraph> ae(g);
2731 ///for(Arc e=ae(u,v);e!=INVALID;e=ae(u,v,e)) n++;
2734 ///Finding the first arc take <em>O(</em>log<em>d)</em> time, where
2735 /// <em>d</em> is the number of outgoing arcs of \c s. Then, the
2736 ///consecutive arcs are found in constant time.
2738 ///\warning If you change the digraph, refresh() must be called before using
2739 ///this operator. If you change the outgoing arcs of
2740 ///a single node \c n, then
2741 ///\ref refresh(Node) "refresh(n)" is enough.
2744 Arc operator()(Node s, Node t, Arc prev=INVALID) const {}
2746 using ArcLookUp<G>::operator() ;
2747 Arc operator()(Node s, Node t, Arc prev) const
2749 return prev==INVALID?(*this)(s,t):_next[prev];
2757 } //END OF NAMESPACE LEMON