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) {
408 while (e != INVALID && (b ? g.v(e) : g.u(e)) != v) {
418 while (e != INVALID && (!b || g.v(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.u(*this),
508 _graph.v(*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.addEdge(nodeRefMap[from.u(it)],
632 nodeRefMap[from.v(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 {
928 bool forward = _from.u(key) != _from.v(key) ?
929 _node_ref[_from.source(key)] ==
930 _to.source(_to.direct(_edge_ref[key], true)) :
931 _from.direction(key);
932 return _to.direct(_edge_ref[key], forward);
937 const EdgeRefMap& _edge_ref;
938 const NodeRefMap& _node_ref;
945 /// \brief Constructor for the GraphCopy.
947 /// It copies the content of the \c _from graph into the
949 GraphCopy(To& to, const From& from)
950 : _from(from), _to(to) {}
952 /// \brief Destructor of the GraphCopy
954 /// Destructor of the GraphCopy
956 for (int i = 0; i < int(_node_maps.size()); ++i) {
957 delete _node_maps[i];
959 for (int i = 0; i < int(_arc_maps.size()); ++i) {
962 for (int i = 0; i < int(_edge_maps.size()); ++i) {
963 delete _edge_maps[i];
968 /// \brief Copies the node references into the given map.
970 /// Copies the node references into the given map.
971 template <typename NodeRef>
972 GraphCopy& nodeRef(NodeRef& map) {
973 _node_maps.push_back(new _graph_utils_bits::RefCopy<From, Node,
974 NodeRefMap, NodeRef>(map));
978 /// \brief Copies the node cross references into the given map.
980 /// Copies the node cross references (reverse references) into
982 template <typename NodeCrossRef>
983 GraphCopy& nodeCrossRef(NodeCrossRef& map) {
984 _node_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
985 NodeRefMap, NodeCrossRef>(map));
989 /// \brief Make copy of the given map.
991 /// Makes copy of the given map for the newly created graph.
992 /// The new map's key type is the to graph's node type,
993 /// and the copied map's key type is the from graph's node
995 template <typename ToMap, typename FromMap>
996 GraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
997 _node_maps.push_back(new _graph_utils_bits::MapCopy<From, Node,
998 NodeRefMap, ToMap, FromMap>(tmap, map));
1002 /// \brief Make a copy of the given node.
1004 /// Make a copy of the given node.
1005 GraphCopy& node(TNode& tnode, const Node& snode) {
1006 _node_maps.push_back(new _graph_utils_bits::ItemCopy<From, Node,
1007 NodeRefMap, TNode>(tnode, snode));
1011 /// \brief Copies the arc references into the given map.
1013 /// Copies the arc references into the given map.
1014 template <typename ArcRef>
1015 GraphCopy& arcRef(ArcRef& map) {
1016 _arc_maps.push_back(new _graph_utils_bits::RefCopy<From, Arc,
1017 ArcRefMap, ArcRef>(map));
1021 /// \brief Copies the arc cross references into the given map.
1023 /// Copies the arc cross references (reverse references) into
1025 template <typename ArcCrossRef>
1026 GraphCopy& arcCrossRef(ArcCrossRef& map) {
1027 _arc_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Arc,
1028 ArcRefMap, ArcCrossRef>(map));
1032 /// \brief Make copy of the given map.
1034 /// Makes copy of the given map for the newly created graph.
1035 /// The new map's key type is the to graph's arc type,
1036 /// and the copied map's key type is the from graph's arc
1038 template <typename ToMap, typename FromMap>
1039 GraphCopy& arcMap(ToMap& tmap, const FromMap& map) {
1040 _arc_maps.push_back(new _graph_utils_bits::MapCopy<From, Arc,
1041 ArcRefMap, ToMap, FromMap>(tmap, map));
1045 /// \brief Make a copy of the given arc.
1047 /// Make a copy of the given arc.
1048 GraphCopy& arc(TArc& tarc, const Arc& sarc) {
1049 _arc_maps.push_back(new _graph_utils_bits::ItemCopy<From, Arc,
1050 ArcRefMap, TArc>(tarc, sarc));
1054 /// \brief Copies the edge references into the given map.
1056 /// Copies the edge references into the given map.
1057 template <typename EdgeRef>
1058 GraphCopy& edgeRef(EdgeRef& map) {
1059 _edge_maps.push_back(new _graph_utils_bits::RefCopy<From, Edge,
1060 EdgeRefMap, EdgeRef>(map));
1064 /// \brief Copies the edge cross references into the given map.
1066 /// Copies the edge cross references (reverse
1067 /// references) into the given map.
1068 template <typename EdgeCrossRef>
1069 GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
1070 _edge_maps.push_back(new _graph_utils_bits::CrossRefCopy<From,
1071 Edge, EdgeRefMap, EdgeCrossRef>(map));
1075 /// \brief Make copy of the given map.
1077 /// Makes copy of the given map for the newly created graph.
1078 /// The new map's key type is the to graph's edge type,
1079 /// and the copied map's key type is the from graph's edge
1081 template <typename ToMap, typename FromMap>
1082 GraphCopy& edgeMap(ToMap& tmap, const FromMap& map) {
1083 _edge_maps.push_back(new _graph_utils_bits::MapCopy<From, Edge,
1084 EdgeRefMap, ToMap, FromMap>(tmap, map));
1088 /// \brief Make a copy of the given edge.
1090 /// Make a copy of the given edge.
1091 GraphCopy& edge(TEdge& tedge, const Edge& sedge) {
1092 _edge_maps.push_back(new _graph_utils_bits::ItemCopy<From, Edge,
1093 EdgeRefMap, TEdge>(tedge, sedge));
1097 /// \brief Executes the copies.
1099 /// Executes the copies.
1101 NodeRefMap nodeRefMap(_from);
1102 EdgeRefMap edgeRefMap(_from);
1103 ArcRefMap arcRefMap(_to, _from, edgeRefMap, nodeRefMap);
1104 _graph_utils_bits::GraphCopySelector<To>::
1105 copy(_to, _from, nodeRefMap, edgeRefMap);
1106 for (int i = 0; i < int(_node_maps.size()); ++i) {
1107 _node_maps[i]->copy(_from, nodeRefMap);
1109 for (int i = 0; i < int(_edge_maps.size()); ++i) {
1110 _edge_maps[i]->copy(_from, edgeRefMap);
1112 for (int i = 0; i < int(_arc_maps.size()); ++i) {
1113 _arc_maps[i]->copy(_from, arcRefMap);
1122 std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* >
1125 std::vector<_graph_utils_bits::MapCopyBase<From, Arc, ArcRefMap>* >
1128 std::vector<_graph_utils_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
1133 /// \brief Copy a graph to another graph.
1135 /// Copy a graph to another graph. The complete usage of the
1136 /// function is detailed in the GraphCopy class, but a short
1137 /// example shows a basic work:
1139 /// copyGraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run();
1142 /// After the copy the \c nr map will contain the mapping from the
1143 /// nodes of the \c from graph to the nodes of the \c to graph and
1144 /// \c ecr will contain the mapping from the arcs of the \c to graph
1145 /// to the arcs of the \c from graph.
1148 template <typename To, typename From>
1150 copyGraph(To& to, const From& from) {
1151 return GraphCopy<To, From>(to, from);
1156 /// \addtogroup graph_maps
1159 /// Provides an immutable and unique id for each item in the graph.
1161 /// The IdMap class provides a unique and immutable id for each item of the
1162 /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
1163 /// different items (nodes) get different ids <li>\b immutable: the id of an
1164 /// item (node) does not change (even if you delete other nodes). </ul>
1165 /// Through this map you get access (i.e. can read) the inner id values of
1166 /// the items stored in the graph. This map can be inverted with its member
1167 /// class \c InverseMap or with the \c operator() member.
1169 template <typename _Graph, typename _Item>
1172 typedef _Graph Graph;
1177 /// \brief Constructor.
1179 /// Constructor of the map.
1180 explicit IdMap(const Graph& graph) : _graph(&graph) {}
1182 /// \brief Gives back the \e id of the item.
1184 /// Gives back the immutable and unique \e id of the item.
1185 int operator[](const Item& item) const { return _graph->id(item);}
1187 /// \brief Gives back the item by its id.
1189 /// Gives back the item by its id.
1190 Item operator()(int id) { return _graph->fromId(id, Item()); }
1193 const Graph* _graph;
1197 /// \brief The class represents the inverse of its owner (IdMap).
1199 /// The class represents the inverse of its owner (IdMap).
1204 /// \brief Constructor.
1206 /// Constructor for creating an id-to-item map.
1207 explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1209 /// \brief Constructor.
1211 /// Constructor for creating an id-to-item map.
1212 explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1214 /// \brief Gives back the given item from its id.
1216 /// Gives back the given item from its id.
1218 Item operator[](int id) const { return _graph->fromId(id, Item());}
1221 const Graph* _graph;
1224 /// \brief Gives back the inverse of the map.
1226 /// Gives back the inverse of the IdMap.
1227 InverseMap inverse() const { return InverseMap(*_graph);}
1232 /// \brief General invertable graph-map type.
1234 /// This type provides simple invertable graph-maps.
1235 /// The InvertableMap wraps an arbitrary ReadWriteMap
1236 /// and if a key is set to a new value then store it
1237 /// in the inverse map.
1239 /// The values of the map can be accessed
1240 /// with stl compatible forward iterator.
1242 /// \tparam _Graph The graph type.
1243 /// \tparam _Item The item type of the graph.
1244 /// \tparam _Value The value type of the map.
1246 /// \see IterableValueMap
1247 template <typename _Graph, typename _Item, typename _Value>
1248 class InvertableMap : protected DefaultMap<_Graph, _Item, _Value> {
1251 typedef DefaultMap<_Graph, _Item, _Value> Map;
1252 typedef _Graph Graph;
1254 typedef std::map<_Value, _Item> Container;
1259 /// The key type of InvertableMap (Node, Arc, Edge).
1260 typedef typename Map::Key Key;
1261 /// The value type of the InvertableMap.
1262 typedef typename Map::Value Value;
1266 /// \brief Constructor.
1268 /// Construct a new InvertableMap for the graph.
1270 explicit InvertableMap(const Graph& graph) : Map(graph) {}
1272 /// \brief Forward iterator for values.
1274 /// This iterator is an stl compatible forward
1275 /// iterator on the values of the map. The values can
1276 /// be accessed in the [beginValue, endValue) range.
1279 : public std::iterator<std::forward_iterator_tag, Value> {
1280 friend class InvertableMap;
1282 ValueIterator(typename Container::const_iterator _it)
1288 ValueIterator& operator++() { ++it; return *this; }
1289 ValueIterator operator++(int) {
1290 ValueIterator tmp(*this);
1295 const Value& operator*() const { return it->first; }
1296 const Value* operator->() const { return &(it->first); }
1298 bool operator==(ValueIterator jt) const { return it == jt.it; }
1299 bool operator!=(ValueIterator jt) const { return it != jt.it; }
1302 typename Container::const_iterator it;
1305 /// \brief Returns an iterator to the first value.
1307 /// Returns an stl compatible iterator to the
1308 /// first value of the map. The values of the
1309 /// map can be accessed in the [beginValue, endValue)
1311 ValueIterator beginValue() const {
1312 return ValueIterator(_inv_map.begin());
1315 /// \brief Returns an iterator after the last value.
1317 /// Returns an stl compatible iterator after the
1318 /// last value of the map. The values of the
1319 /// map can be accessed in the [beginValue, endValue)
1321 ValueIterator endValue() const {
1322 return ValueIterator(_inv_map.end());
1325 /// \brief The setter function of the map.
1327 /// Sets the mapped value.
1328 void set(const Key& key, const Value& val) {
1329 Value oldval = Map::operator[](key);
1330 typename Container::iterator it = _inv_map.find(oldval);
1331 if (it != _inv_map.end() && it->second == key) {
1334 _inv_map.insert(make_pair(val, key));
1338 /// \brief The getter function of the map.
1340 /// It gives back the value associated with the key.
1341 typename MapTraits<Map>::ConstReturnValue
1342 operator[](const Key& key) const {
1343 return Map::operator[](key);
1346 /// \brief Gives back the item by its value.
1348 /// Gives back the item by its value.
1349 Key operator()(const Value& key) const {
1350 typename Container::const_iterator it = _inv_map.find(key);
1351 return it != _inv_map.end() ? it->second : INVALID;
1356 /// \brief Erase the key from the map.
1358 /// Erase the key to the map. It is called by the
1359 /// \c AlterationNotifier.
1360 virtual void erase(const Key& key) {
1361 Value val = Map::operator[](key);
1362 typename Container::iterator it = _inv_map.find(val);
1363 if (it != _inv_map.end() && it->second == key) {
1369 /// \brief Erase more keys from the map.
1371 /// Erase more keys from the map. It is called by the
1372 /// \c AlterationNotifier.
1373 virtual void erase(const std::vector<Key>& keys) {
1374 for (int i = 0; i < int(keys.size()); ++i) {
1375 Value val = Map::operator[](keys[i]);
1376 typename Container::iterator it = _inv_map.find(val);
1377 if (it != _inv_map.end() && it->second == keys[i]) {
1384 /// \brief Clear the keys from the map and inverse map.
1386 /// Clear the keys from the map and inverse map. It is called by the
1387 /// \c AlterationNotifier.
1388 virtual void clear() {
1395 /// \brief The inverse map type.
1397 /// The inverse of this map. The subscript operator of the map
1398 /// gives back always the item what was last assigned to the value.
1401 /// \brief Constructor of the InverseMap.
1403 /// Constructor of the InverseMap.
1404 explicit InverseMap(const InvertableMap& inverted)
1405 : _inverted(inverted) {}
1407 /// The value type of the InverseMap.
1408 typedef typename InvertableMap::Key Value;
1409 /// The key type of the InverseMap.
1410 typedef typename InvertableMap::Value Key;
1412 /// \brief Subscript operator.
1414 /// Subscript operator. It gives back always the item
1415 /// what was last assigned to the value.
1416 Value operator[](const Key& key) const {
1417 return _inverted(key);
1421 const InvertableMap& _inverted;
1424 /// \brief It gives back the just readable inverse map.
1426 /// It gives back the just readable inverse map.
1427 InverseMap inverse() const {
1428 return InverseMap(*this);
1435 /// \brief Provides a mutable, continuous and unique descriptor for each
1436 /// item in the graph.
1438 /// The DescriptorMap class provides a unique and continuous (but mutable)
1439 /// descriptor (id) for each item of the same type (e.g. node) in the
1440 /// graph. This id is <ul><li>\b unique: different items (nodes) get
1441 /// different ids <li>\b continuous: the range of the ids is the set of
1442 /// integers between 0 and \c n-1, where \c n is the number of the items of
1443 /// this type (e.g. nodes) (so the id of a node can change if you delete an
1444 /// other node, i.e. this id is mutable). </ul> This map can be inverted
1445 /// with its member class \c InverseMap, or with the \c operator() member.
1447 /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
1448 /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or
1450 template <typename _Graph, typename _Item>
1451 class DescriptorMap : protected DefaultMap<_Graph, _Item, int> {
1454 typedef DefaultMap<_Graph, _Item, int> Map;
1457 /// The graph class of DescriptorMap.
1458 typedef _Graph Graph;
1460 /// The key type of DescriptorMap (Node, Arc, Edge).
1461 typedef typename Map::Key Key;
1462 /// The value type of DescriptorMap.
1463 typedef typename Map::Value Value;
1465 /// \brief Constructor.
1467 /// Constructor for descriptor map.
1468 explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
1470 const typename Map::Notifier* nf = Map::notifier();
1471 for (nf->first(it); it != INVALID; nf->next(it)) {
1472 Map::set(it, _inv_map.size());
1473 _inv_map.push_back(it);
1479 /// \brief Add a new key to the map.
1481 /// Add a new key to the map. It is called by the
1482 /// \c AlterationNotifier.
1483 virtual void add(const Item& item) {
1485 Map::set(item, _inv_map.size());
1486 _inv_map.push_back(item);
1489 /// \brief Add more new keys to the map.
1491 /// Add more new keys to the map. It is called by the
1492 /// \c AlterationNotifier.
1493 virtual void add(const std::vector<Item>& items) {
1495 for (int i = 0; i < int(items.size()); ++i) {
1496 Map::set(items[i], _inv_map.size());
1497 _inv_map.push_back(items[i]);
1501 /// \brief Erase the key from the map.
1503 /// Erase the key from the map. It is called by the
1504 /// \c AlterationNotifier.
1505 virtual void erase(const Item& item) {
1506 Map::set(_inv_map.back(), Map::operator[](item));
1507 _inv_map[Map::operator[](item)] = _inv_map.back();
1508 _inv_map.pop_back();
1512 /// \brief Erase more keys from the map.
1514 /// Erase more keys from the map. It is called by the
1515 /// \c AlterationNotifier.
1516 virtual void erase(const std::vector<Item>& items) {
1517 for (int i = 0; i < int(items.size()); ++i) {
1518 Map::set(_inv_map.back(), Map::operator[](items[i]));
1519 _inv_map[Map::operator[](items[i])] = _inv_map.back();
1520 _inv_map.pop_back();
1525 /// \brief Build the unique map.
1527 /// Build the unique map. It is called by the
1528 /// \c AlterationNotifier.
1529 virtual void build() {
1532 const typename Map::Notifier* nf = Map::notifier();
1533 for (nf->first(it); it != INVALID; nf->next(it)) {
1534 Map::set(it, _inv_map.size());
1535 _inv_map.push_back(it);
1539 /// \brief Clear the keys from the map.
1541 /// Clear the keys from the map. It is called by the
1542 /// \c AlterationNotifier.
1543 virtual void clear() {
1550 /// \brief Returns the maximal value plus one.
1552 /// Returns the maximal value plus one in the map.
1553 unsigned int size() const {
1554 return _inv_map.size();
1557 /// \brief Swaps the position of the two items in the map.
1559 /// Swaps the position of the two items in the map.
1560 void swap(const Item& p, const Item& q) {
1561 int pi = Map::operator[](p);
1562 int qi = Map::operator[](q);
1569 /// \brief Gives back the \e descriptor of the item.
1571 /// Gives back the mutable and unique \e descriptor of the map.
1572 int operator[](const Item& item) const {
1573 return Map::operator[](item);
1576 /// \brief Gives back the item by its descriptor.
1578 /// Gives back th item by its descriptor.
1579 Item operator()(int id) const {
1580 return _inv_map[id];
1585 typedef std::vector<Item> Container;
1589 /// \brief The inverse map type of DescriptorMap.
1591 /// The inverse map type of DescriptorMap.
1594 /// \brief Constructor of the InverseMap.
1596 /// Constructor of the InverseMap.
1597 explicit InverseMap(const DescriptorMap& inverted)
1598 : _inverted(inverted) {}
1601 /// The value type of the InverseMap.
1602 typedef typename DescriptorMap::Key Value;
1603 /// The key type of the InverseMap.
1604 typedef typename DescriptorMap::Value Key;
1606 /// \brief Subscript operator.
1608 /// Subscript operator. It gives back the item
1609 /// that the descriptor belongs to currently.
1610 Value operator[](const Key& key) const {
1611 return _inverted(key);
1614 /// \brief Size of the map.
1616 /// Returns the size of the map.
1617 unsigned int size() const {
1618 return _inverted.size();
1622 const DescriptorMap& _inverted;
1625 /// \brief Gives back the inverse of the map.
1627 /// Gives back the inverse of the map.
1628 const InverseMap inverse() const {
1629 return InverseMap(*this);
1633 /// \brief Returns the source of the given arc.
1635 /// The SourceMap gives back the source Node of the given arc.
1637 template <typename Digraph>
1641 typedef typename Digraph::Node Value;
1642 typedef typename Digraph::Arc Key;
1644 /// \brief Constructor
1647 /// \param _digraph The digraph that the map belongs to.
1648 explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
1650 /// \brief The subscript operator.
1652 /// The subscript operator.
1653 /// \param arc The arc
1654 /// \return The source of the arc
1655 Value operator[](const Key& arc) const {
1656 return _digraph.source(arc);
1660 const Digraph& _digraph;
1663 /// \brief Returns a \ref SourceMap class.
1665 /// This function just returns an \ref SourceMap class.
1666 /// \relates SourceMap
1667 template <typename Digraph>
1668 inline SourceMap<Digraph> sourceMap(const Digraph& digraph) {
1669 return SourceMap<Digraph>(digraph);
1672 /// \brief Returns the target of the given arc.
1674 /// The TargetMap gives back the target Node of the given arc.
1676 template <typename Digraph>
1680 typedef typename Digraph::Node Value;
1681 typedef typename Digraph::Arc Key;
1683 /// \brief Constructor
1686 /// \param _digraph The digraph that the map belongs to.
1687 explicit TargetMap(const Digraph& digraph) : _digraph(digraph) {}
1689 /// \brief The subscript operator.
1691 /// The subscript operator.
1692 /// \param e The arc
1693 /// \return The target of the arc
1694 Value operator[](const Key& e) const {
1695 return _digraph.target(e);
1699 const Digraph& _digraph;
1702 /// \brief Returns a \ref TargetMap class.
1704 /// This function just returns a \ref TargetMap class.
1705 /// \relates TargetMap
1706 template <typename Digraph>
1707 inline TargetMap<Digraph> targetMap(const Digraph& digraph) {
1708 return TargetMap<Digraph>(digraph);
1711 /// \brief Returns the "forward" directed arc view of an edge.
1713 /// Returns the "forward" directed arc view of an edge.
1714 /// \see BackwardMap
1715 template <typename Graph>
1719 typedef typename Graph::Arc Value;
1720 typedef typename Graph::Edge Key;
1722 /// \brief Constructor
1725 /// \param _graph The graph that the map belongs to.
1726 explicit ForwardMap(const Graph& graph) : _graph(graph) {}
1728 /// \brief The subscript operator.
1730 /// The subscript operator.
1731 /// \param key An edge
1732 /// \return The "forward" directed arc view of edge
1733 Value operator[](const Key& key) const {
1734 return _graph.direct(key, true);
1738 const Graph& _graph;
1741 /// \brief Returns a \ref ForwardMap class.
1743 /// This function just returns an \ref ForwardMap class.
1744 /// \relates ForwardMap
1745 template <typename Graph>
1746 inline ForwardMap<Graph> forwardMap(const Graph& graph) {
1747 return ForwardMap<Graph>(graph);
1750 /// \brief Returns the "backward" directed arc view of an edge.
1752 /// Returns the "backward" directed arc view of an edge.
1754 template <typename Graph>
1758 typedef typename Graph::Arc Value;
1759 typedef typename Graph::Edge Key;
1761 /// \brief Constructor
1764 /// \param _graph The graph that the map belongs to.
1765 explicit BackwardMap(const Graph& graph) : _graph(graph) {}
1767 /// \brief The subscript operator.
1769 /// The subscript operator.
1770 /// \param key An edge
1771 /// \return The "backward" directed arc view of edge
1772 Value operator[](const Key& key) const {
1773 return _graph.direct(key, false);
1777 const Graph& _graph;
1780 /// \brief Returns a \ref BackwardMap class
1782 /// This function just returns a \ref BackwardMap class.
1783 /// \relates BackwardMap
1784 template <typename Graph>
1785 inline BackwardMap<Graph> backwardMap(const Graph& graph) {
1786 return BackwardMap<Graph>(graph);
1789 /// \brief Potential difference map
1791 /// If there is an potential map on the nodes then we
1792 /// can get an arc map as we get the substraction of the
1793 /// values of the target and source.
1794 template <typename Digraph, typename NodeMap>
1795 class PotentialDifferenceMap {
1797 typedef typename Digraph::Arc Key;
1798 typedef typename NodeMap::Value Value;
1800 /// \brief Constructor
1802 /// Contructor of the map
1803 explicit PotentialDifferenceMap(const Digraph& digraph,
1804 const NodeMap& potential)
1805 : _digraph(digraph), _potential(potential) {}
1807 /// \brief Const subscription operator
1809 /// Const subscription operator
1810 Value operator[](const Key& arc) const {
1811 return _potential[_digraph.target(arc)] -
1812 _potential[_digraph.source(arc)];
1816 const Digraph& _digraph;
1817 const NodeMap& _potential;
1820 /// \brief Returns a PotentialDifferenceMap.
1822 /// This function just returns a PotentialDifferenceMap.
1823 /// \relates PotentialDifferenceMap
1824 template <typename Digraph, typename NodeMap>
1825 PotentialDifferenceMap<Digraph, NodeMap>
1826 potentialDifferenceMap(const Digraph& digraph, const NodeMap& potential) {
1827 return PotentialDifferenceMap<Digraph, NodeMap>(digraph, potential);
1830 /// \brief Map of the node in-degrees.
1832 /// This map returns the in-degree of a node. Once it is constructed,
1833 /// the degrees are stored in a standard NodeMap, so each query is done
1834 /// in constant time. On the other hand, the values are updated automatically
1835 /// whenever the digraph changes.
1837 /// \warning Besides addNode() and addArc(), a digraph structure may provide
1838 /// alternative ways to modify the digraph. The correct behavior of InDegMap
1839 /// is not guarantied if these additional features are used. For example
1840 /// the functions \ref ListDigraph::changeSource() "changeSource()",
1841 /// \ref ListDigraph::changeTarget() "changeTarget()" and
1842 /// \ref ListDigraph::reverseArc() "reverseArc()"
1843 /// of \ref ListDigraph will \e not update the degree values correctly.
1847 template <typename _Digraph>
1849 : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
1850 ::ItemNotifier::ObserverBase {
1854 typedef _Digraph Digraph;
1856 typedef typename Digraph::Node Key;
1858 typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
1859 ::ItemNotifier::ObserverBase Parent;
1863 class AutoNodeMap : public DefaultMap<Digraph, Key, int> {
1866 typedef DefaultMap<Digraph, Key, int> Parent;
1868 AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
1870 virtual void add(const Key& key) {
1872 Parent::set(key, 0);
1875 virtual void add(const std::vector<Key>& keys) {
1877 for (int i = 0; i < int(keys.size()); ++i) {
1878 Parent::set(keys[i], 0);
1882 virtual void build() {
1885 typename Parent::Notifier* nf = Parent::notifier();
1886 for (nf->first(it); it != INVALID; nf->next(it)) {
1894 /// \brief Constructor.
1896 /// Constructor for creating in-degree map.
1897 explicit InDegMap(const Digraph& digraph)
1898 : _digraph(digraph), _deg(digraph) {
1899 Parent::attach(_digraph.notifier(typename Digraph::Arc()));
1901 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1902 _deg[it] = countInArcs(_digraph, it);
1906 /// Gives back the in-degree of a Node.
1907 int operator[](const Key& key) const {
1913 typedef typename Digraph::Arc Arc;
1915 virtual void add(const Arc& arc) {
1916 ++_deg[_digraph.target(arc)];
1919 virtual void add(const std::vector<Arc>& arcs) {
1920 for (int i = 0; i < int(arcs.size()); ++i) {
1921 ++_deg[_digraph.target(arcs[i])];
1925 virtual void erase(const Arc& arc) {
1926 --_deg[_digraph.target(arc)];
1929 virtual void erase(const std::vector<Arc>& arcs) {
1930 for (int i = 0; i < int(arcs.size()); ++i) {
1931 --_deg[_digraph.target(arcs[i])];
1935 virtual void build() {
1936 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1937 _deg[it] = countInArcs(_digraph, it);
1941 virtual void clear() {
1942 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1948 const Digraph& _digraph;
1952 /// \brief Map of the node out-degrees.
1954 /// This map returns the out-degree of a node. Once it is constructed,
1955 /// the degrees are stored in a standard NodeMap, so each query is done
1956 /// in constant time. On the other hand, the values are updated automatically
1957 /// whenever the digraph changes.
1959 /// \warning Besides addNode() and addArc(), a digraph structure may provide
1960 /// alternative ways to modify the digraph. The correct behavior of OutDegMap
1961 /// is not guarantied if these additional features are used. For example
1962 /// the functions \ref ListDigraph::changeSource() "changeSource()",
1963 /// \ref ListDigraph::changeTarget() "changeTarget()" and
1964 /// \ref ListDigraph::reverseArc() "reverseArc()"
1965 /// of \ref ListDigraph will \e not update the degree values correctly.
1969 template <typename _Digraph>
1971 : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
1972 ::ItemNotifier::ObserverBase {
1976 typedef _Digraph Digraph;
1978 typedef typename Digraph::Node Key;
1980 typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
1981 ::ItemNotifier::ObserverBase Parent;
1985 class AutoNodeMap : public DefaultMap<Digraph, Key, int> {
1988 typedef DefaultMap<Digraph, Key, int> Parent;
1990 AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
1992 virtual void add(const Key& key) {
1994 Parent::set(key, 0);
1996 virtual void add(const std::vector<Key>& keys) {
1998 for (int i = 0; i < int(keys.size()); ++i) {
1999 Parent::set(keys[i], 0);
2002 virtual void build() {
2005 typename Parent::Notifier* nf = Parent::notifier();
2006 for (nf->first(it); it != INVALID; nf->next(it)) {
2014 /// \brief Constructor.
2016 /// Constructor for creating out-degree map.
2017 explicit OutDegMap(const Digraph& digraph)
2018 : _digraph(digraph), _deg(digraph) {
2019 Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2021 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2022 _deg[it] = countOutArcs(_digraph, it);
2026 /// Gives back the out-degree of a Node.
2027 int operator[](const Key& key) const {
2033 typedef typename Digraph::Arc Arc;
2035 virtual void add(const Arc& arc) {
2036 ++_deg[_digraph.source(arc)];
2039 virtual void add(const std::vector<Arc>& arcs) {
2040 for (int i = 0; i < int(arcs.size()); ++i) {
2041 ++_deg[_digraph.source(arcs[i])];
2045 virtual void erase(const Arc& arc) {
2046 --_deg[_digraph.source(arc)];
2049 virtual void erase(const std::vector<Arc>& arcs) {
2050 for (int i = 0; i < int(arcs.size()); ++i) {
2051 --_deg[_digraph.source(arcs[i])];
2055 virtual void build() {
2056 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2057 _deg[it] = countOutArcs(_digraph, it);
2061 virtual void clear() {
2062 for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2068 const Digraph& _digraph;
2073 ///Dynamic arc look up between given endpoints.
2076 ///Using this class, you can find an arc in a digraph from a given
2077 ///source to a given target in amortized time <em>O(log d)</em>,
2078 ///where <em>d</em> is the out-degree of the source node.
2080 ///It is possible to find \e all parallel arcs between two nodes with
2081 ///the \c findFirst() and \c findNext() members.
2083 ///See the \ref ArcLookUp and \ref AllArcLookUp classes if your
2084 ///digraph is not changed so frequently.
2086 ///This class uses a self-adjusting binary search tree, Sleator's
2087 ///and Tarjan's Splay tree for guarantee the logarithmic amortized
2088 ///time bound for arc lookups. This class also guarantees the
2089 ///optimal time bound in a constant factor for any distribution of
2092 ///\tparam G The type of the underlying digraph.
2098 : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
2101 typedef typename ItemSetTraits<G, typename G::Arc>
2102 ::ItemNotifier::ObserverBase Parent;
2104 TEMPLATE_DIGRAPH_TYPEDEFS(G);
2109 class AutoNodeMap : public DefaultMap<G, Node, Arc> {
2112 typedef DefaultMap<G, Node, Arc> Parent;
2114 AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
2116 virtual void add(const Node& node) {
2118 Parent::set(node, INVALID);
2121 virtual void add(const std::vector<Node>& nodes) {
2123 for (int i = 0; i < int(nodes.size()); ++i) {
2124 Parent::set(nodes[i], INVALID);
2128 virtual void build() {
2131 typename Parent::Notifier* nf = Parent::notifier();
2132 for (nf->first(it); it != INVALID; nf->next(it)) {
2133 Parent::set(it, INVALID);
2140 typename Digraph::template ArcMap<Arc> _parent;
2141 typename Digraph::template ArcMap<Arc> _left;
2142 typename Digraph::template ArcMap<Arc> _right;
2147 ArcLess(const Digraph &_g) : g(_g) {}
2148 bool operator()(Arc a,Arc b) const
2150 return g.target(a)<g.target(b);
2160 ///It builds up the search database.
2161 DynArcLookUp(const Digraph &g)
2162 : _g(g),_head(g),_parent(g),_left(g),_right(g)
2164 Parent::attach(_g.notifier(typename Digraph::Arc()));
2170 virtual void add(const Arc& arc) {
2174 virtual void add(const std::vector<Arc>& arcs) {
2175 for (int i = 0; i < int(arcs.size()); ++i) {
2180 virtual void erase(const Arc& arc) {
2184 virtual void erase(const std::vector<Arc>& arcs) {
2185 for (int i = 0; i < int(arcs.size()); ++i) {
2190 virtual void build() {
2194 virtual void clear() {
2195 for(NodeIt n(_g);n!=INVALID;++n) {
2196 _head.set(n, INVALID);
2200 void insert(Arc arc) {
2201 Node s = _g.source(arc);
2202 Node t = _g.target(arc);
2203 _left.set(arc, INVALID);
2204 _right.set(arc, INVALID);
2209 _parent.set(arc, INVALID);
2213 if (t < _g.target(e)) {
2214 if (_left[e] == INVALID) {
2216 _parent.set(arc, e);
2223 if (_right[e] == INVALID) {
2225 _parent.set(arc, e);
2235 void remove(Arc arc) {
2236 if (_left[arc] == INVALID) {
2237 if (_right[arc] != INVALID) {
2238 _parent.set(_right[arc], _parent[arc]);
2240 if (_parent[arc] != INVALID) {
2241 if (_left[_parent[arc]] == arc) {
2242 _left.set(_parent[arc], _right[arc]);
2244 _right.set(_parent[arc], _right[arc]);
2247 _head.set(_g.source(arc), _right[arc]);
2249 } else if (_right[arc] == INVALID) {
2250 _parent.set(_left[arc], _parent[arc]);
2251 if (_parent[arc] != INVALID) {
2252 if (_left[_parent[arc]] == arc) {
2253 _left.set(_parent[arc], _left[arc]);
2255 _right.set(_parent[arc], _left[arc]);
2258 _head.set(_g.source(arc), _left[arc]);
2262 if (_right[e] != INVALID) {
2264 while (_right[e] != INVALID) {
2268 _right.set(_parent[e], _left[e]);
2269 if (_left[e] != INVALID) {
2270 _parent.set(_left[e], _parent[e]);
2273 _left.set(e, _left[arc]);
2274 _parent.set(_left[arc], e);
2275 _right.set(e, _right[arc]);
2276 _parent.set(_right[arc], e);
2278 _parent.set(e, _parent[arc]);
2279 if (_parent[arc] != INVALID) {
2280 if (_left[_parent[arc]] == arc) {
2281 _left.set(_parent[arc], e);
2283 _right.set(_parent[arc], e);
2288 _right.set(e, _right[arc]);
2289 _parent.set(_right[arc], e);
2291 if (_parent[arc] != INVALID) {
2292 if (_left[_parent[arc]] == arc) {
2293 _left.set(_parent[arc], e);
2295 _right.set(_parent[arc], e);
2298 _head.set(_g.source(arc), e);
2304 Arc refreshRec(std::vector<Arc> &v,int a,int b)
2309 Arc left = refreshRec(v,a,m-1);
2310 _left.set(me, left);
2311 _parent.set(left, me);
2313 _left.set(me, INVALID);
2316 Arc right = refreshRec(v,m+1,b);
2317 _right.set(me, right);
2318 _parent.set(right, me);
2320 _right.set(me, INVALID);
2326 for(NodeIt n(_g);n!=INVALID;++n) {
2328 for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
2330 std::sort(v.begin(),v.end(),ArcLess(_g));
2331 Arc head = refreshRec(v,0,v.size()-1);
2333 _parent.set(head, INVALID);
2335 else _head.set(n, INVALID);
2341 _parent.set(v, _parent[w]);
2343 _left.set(w, _right[v]);
2345 if (_parent[v] != INVALID) {
2346 if (_right[_parent[v]] == w) {
2347 _right.set(_parent[v], v);
2349 _left.set(_parent[v], v);
2352 if (_left[w] != INVALID){
2353 _parent.set(_left[w], w);
2359 _parent.set(v, _parent[w]);
2361 _right.set(w, _left[v]);
2363 if (_parent[v] != INVALID){
2364 if (_left[_parent[v]] == w) {
2365 _left.set(_parent[v], v);
2367 _right.set(_parent[v], v);
2370 if (_right[w] != INVALID){
2371 _parent.set(_right[w], w);
2376 while (_parent[v] != INVALID) {
2377 if (v == _left[_parent[v]]) {
2378 if (_parent[_parent[v]] == INVALID) {
2381 if (_parent[v] == _left[_parent[_parent[v]]]) {
2390 if (_parent[_parent[v]] == INVALID) {
2393 if (_parent[v] == _left[_parent[_parent[v]]]) {
2403 _head[_g.source(v)] = v;
2409 ///Find an arc between two nodes.
2411 ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
2412 /// <em>d</em> is the number of outgoing arcs of \c s.
2413 ///\param s The source node
2414 ///\param t The target node
2415 ///\return An arc from \c s to \c t if there exists,
2416 ///\ref INVALID otherwise.
2417 Arc operator()(Node s, Node t) const
2421 if (_g.target(a) == t) {
2422 const_cast<DynArcLookUp&>(*this).splay(a);
2424 } else if (t < _g.target(a)) {
2425 if (_left[a] == INVALID) {
2426 const_cast<DynArcLookUp&>(*this).splay(a);
2432 if (_right[a] == INVALID) {
2433 const_cast<DynArcLookUp&>(*this).splay(a);
2442 ///Find the first arc between two nodes.
2444 ///Find the first arc between two nodes in time
2445 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2446 /// outgoing arcs of \c s.
2447 ///\param s The source node
2448 ///\param t The target node
2449 ///\return An arc from \c s to \c t if there exists, \ref INVALID
2451 Arc findFirst(Node s, Node t) const
2456 if (_g.target(a) < t) {
2457 if (_right[a] == INVALID) {
2458 const_cast<DynArcLookUp&>(*this).splay(a);
2464 if (_g.target(a) == t) {
2467 if (_left[a] == INVALID) {
2468 const_cast<DynArcLookUp&>(*this).splay(a);
2477 ///Find the next arc between two nodes.
2479 ///Find the next arc between two nodes in time
2480 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2481 /// outgoing arcs of \c s.
2482 ///\param s The source node
2483 ///\param t The target node
2484 ///\return An arc from \c s to \c t if there exists, \ref INVALID
2487 ///\note If \c e is not the result of the previous \c findFirst()
2488 ///operation then the amorized time bound can not be guaranteed.
2490 Arc findNext(Node s, Node t, Arc a) const
2492 Arc findNext(Node, Node t, Arc a) const
2495 if (_right[a] != INVALID) {
2497 while (_left[a] != INVALID) {
2500 const_cast<DynArcLookUp&>(*this).splay(a);
2502 while (_parent[a] != INVALID && _right[_parent[a]] == a) {
2505 if (_parent[a] == INVALID) {
2509 const_cast<DynArcLookUp&>(*this).splay(a);
2512 if (_g.target(a) == t) return a;
2513 else return INVALID;
2518 ///Fast arc look up between given endpoints.
2521 ///Using this class, you can find an arc in a digraph from a given
2522 ///source to a given target in time <em>O(log d)</em>,
2523 ///where <em>d</em> is the out-degree of the source node.
2525 ///It is not possible to find \e all parallel arcs between two nodes.
2526 ///Use \ref AllArcLookUp for this purpose.
2528 ///\warning This class is static, so you should refresh() (or at least
2529 ///refresh(Node)) this data structure
2530 ///whenever the digraph changes. This is a time consuming (superlinearly
2531 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2533 ///\tparam G The type of the underlying digraph.
2541 TEMPLATE_DIGRAPH_TYPEDEFS(G);
2546 typename Digraph::template NodeMap<Arc> _head;
2547 typename Digraph::template ArcMap<Arc> _left;
2548 typename Digraph::template ArcMap<Arc> _right;
2553 ArcLess(const Digraph &_g) : g(_g) {}
2554 bool operator()(Arc a,Arc b) const
2556 return g.target(a)<g.target(b);
2566 ///It builds up the search database, which remains valid until the digraph
2568 ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
2571 Arc refreshRec(std::vector<Arc> &v,int a,int b)
2575 _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
2576 _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
2580 ///Refresh the data structure at a node.
2582 ///Build up the search database of node \c n.
2584 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
2585 ///the number of the outgoing arcs of \c n.
2586 void refresh(Node n)
2589 for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
2591 std::sort(v.begin(),v.end(),ArcLess(_g));
2592 _head[n]=refreshRec(v,0,v.size()-1);
2594 else _head[n]=INVALID;
2596 ///Refresh the full data structure.
2598 ///Build up the full search database. In fact, it simply calls
2599 ///\ref refresh(Node) "refresh(n)" for each node \c n.
2601 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
2602 ///the number of the arcs of \c n and <em>D</em> is the maximum
2603 ///out-degree of the digraph.
2607 for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
2610 ///Find an arc between two nodes.
2612 ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
2613 /// <em>d</em> is the number of outgoing arcs of \c s.
2614 ///\param s The source node
2615 ///\param t The target node
2616 ///\return An arc from \c s to \c t if there exists,
2617 ///\ref INVALID otherwise.
2619 ///\warning If you change the digraph, refresh() must be called before using
2620 ///this operator. If you change the outgoing arcs of
2621 ///a single node \c n, then
2622 ///\ref refresh(Node) "refresh(n)" is enough.
2624 Arc operator()(Node s, Node t) const
2628 e!=INVALID&&_g.target(e)!=t;
2629 e = t < _g.target(e)?_left[e]:_right[e]) ;
2635 ///Fast look up of all arcs between given endpoints.
2638 ///This class is the same as \ref ArcLookUp, with the addition
2639 ///that it makes it possible to find all arcs between given endpoints.
2641 ///\warning This class is static, so you should refresh() (or at least
2642 ///refresh(Node)) this data structure
2643 ///whenever the digraph changes. This is a time consuming (superlinearly
2644 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2646 ///\tparam G The type of the underlying digraph.
2651 class AllArcLookUp : public ArcLookUp<G>
2653 using ArcLookUp<G>::_g;
2654 using ArcLookUp<G>::_right;
2655 using ArcLookUp<G>::_left;
2656 using ArcLookUp<G>::_head;
2658 TEMPLATE_DIGRAPH_TYPEDEFS(G);
2661 typename Digraph::template ArcMap<Arc> _next;
2663 Arc refreshNext(Arc head,Arc next=INVALID)
2665 if(head==INVALID) return next;
2667 next=refreshNext(_right[head],next);
2668 // _next[head]=next;
2669 _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
2671 return refreshNext(_left[head],head);
2677 for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
2685 ///It builds up the search database, which remains valid until the digraph
2687 AllArcLookUp(const Digraph &g) : ArcLookUp<G>(g), _next(g) {refreshNext();}
2689 ///Refresh the data structure at a node.
2691 ///Build up the search database of node \c n.
2693 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
2694 ///the number of the outgoing arcs of \c n.
2696 void refresh(Node n)
2698 ArcLookUp<G>::refresh(n);
2699 refreshNext(_head[n]);
2702 ///Refresh the full data structure.
2704 ///Build up the full search database. In fact, it simply calls
2705 ///\ref refresh(Node) "refresh(n)" for each node \c n.
2707 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
2708 ///the number of the arcs of \c n and <em>D</em> is the maximum
2709 ///out-degree of the digraph.
2713 for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
2716 ///Find an arc between two nodes.
2718 ///Find an arc between two nodes.
2719 ///\param s The source node
2720 ///\param t The target node
2721 ///\param prev The previous arc between \c s and \c t. It it is INVALID or
2722 ///not given, the operator finds the first appropriate arc.
2723 ///\return An arc from \c s to \c t after \c prev or
2724 ///\ref INVALID if there is no more.
2726 ///For example, you can count the number of arcs from \c u to \c v in the
2729 ///AllArcLookUp<ListDigraph> ae(g);
2732 ///for(Arc e=ae(u,v);e!=INVALID;e=ae(u,v,e)) n++;
2735 ///Finding the first arc take <em>O(</em>log<em>d)</em> time, where
2736 /// <em>d</em> is the number of outgoing arcs of \c s. Then, the
2737 ///consecutive arcs are found in constant time.
2739 ///\warning If you change the digraph, refresh() must be called before using
2740 ///this operator. If you change the outgoing arcs of
2741 ///a single node \c n, then
2742 ///\ref refresh(Node) "refresh(n)" is enough.
2745 Arc operator()(Node s, Node t, Arc prev=INVALID) const {}
2747 using ArcLookUp<G>::operator() ;
2748 Arc operator()(Node s, Node t, Arc prev) const
2750 return prev==INVALID?(*this)(s,t):_next[prev];
2758 } //END OF NAMESPACE LEMON