# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1225563738 -3600
# Node ID 80a4d0742e985cb88650088846ddb8f0ab9f3534
# Parent 37557a46e29874bd50b7c0e54c5595dc6bde36a2
Improvements related to full graphs (#57)
diff --git a/lemon/full_graph.h b/lemon/full_graph.h
a
|
b
|
|
19 | 19 | #ifndef LEMON_FULL_GRAPH_H |
20 | 20 | #define LEMON_FULL_GRAPH_H |
21 | 21 | |
22 | | #include <lemon/math.h> |
23 | | |
24 | 22 | #include <lemon/core.h> |
25 | 23 | #include <lemon/bits/graph_extender.h> |
26 | 24 | |
27 | 25 | ///\ingroup graphs |
28 | 26 | ///\file |
29 | | ///\brief FullDigraph and FullGraph classes. |
| 27 | ///\brief FullGraph and FullDigraph classes. |
| 28 | |
30 | 29 | namespace lemon { |
31 | 30 | |
32 | 31 | class FullDigraphBase { |
… |
… |
|
67 | 66 | Node source(Arc arc) const { return arc._id / _node_num; } |
68 | 67 | Node target(Arc arc) const { return arc._id % _node_num; } |
69 | 68 | |
70 | | |
71 | 69 | static int id(Node node) { return node._id; } |
72 | 70 | static int id(Arc arc) { return arc._id; } |
73 | 71 | |
74 | 72 | static Node nodeFromId(int id) { return Node(id);} |
75 | | |
76 | 73 | static Arc arcFromId(int id) { return Arc(id);} |
77 | 74 | |
78 | 75 | typedef True FindArcTag; |
… |
… |
|
80 | 77 | Arc findArc(Node s, Node t, Arc prev = INVALID) const { |
81 | 78 | return prev != INVALID ? arc(s, t) : INVALID; |
82 | 79 | } |
83 | | |
84 | 80 | |
85 | 81 | class Node { |
86 | 82 | friend class FullDigraphBase; |
… |
… |
|
157 | 153 | /// This is a simple and fast directed full graph implementation. |
158 | 154 | /// From each node go arcs to each node (including the source node), |
159 | 155 | /// therefore the number of the arcs in the digraph is the square of |
160 | | /// the node number. The digraph is completely static, so you can |
161 | | /// neither add nor delete either arcs or nodes, and it needs just |
| 156 | /// the node number. This digraph type is completely static, so you |
| 157 | /// can neither add nor delete either arcs or nodes, and it needs |
162 | 158 | /// constant space in memory. |
163 | 159 | /// |
164 | | /// Thus it conforms to the \ref concepts::Digraph "Digraph" concept |
| 160 | /// This class conforms to the \ref concepts::Digraph "Digraph" concept |
165 | 161 | /// and it also has an important extra feature that its maps are |
166 | 162 | /// real \ref concepts::ReferenceMap "reference map"s. |
167 | | /// \sa concepts::Digraph. |
| 163 | /// |
| 164 | /// The \c FullDigraph and \c FullGraph classes are very similar, |
| 165 | /// but there are two differences. While this class conforms only |
| 166 | /// to the \ref concepts::Digraph "Digraph" concept, the \c FullGraph |
| 167 | /// class conforms to the \ref concepts::Graph "Graph" concept, |
| 168 | /// moreover \c FullGraph does not contain a loop arc for each |
| 169 | /// node as \c FullDigraph does. |
168 | 170 | /// |
169 | 171 | /// \sa FullGraph |
170 | 172 | class FullDigraph : public ExtendedFullDigraphBase { |
… |
… |
|
177 | 179 | |
178 | 180 | /// \brief Constructor |
179 | 181 | /// |
| 182 | /// Constructor. |
180 | 183 | /// \param n The number of the nodes. |
181 | 184 | FullDigraph(int n) { construct(n); } |
182 | 185 | |
183 | | /// \brief Resize the digraph |
| 186 | /// \brief Resizes the digraph |
184 | 187 | /// |
185 | | /// Resize the digraph. The function will fully destroy and |
186 | | /// rebuild the digraph. This cause that the maps of the digraph |
187 | | /// will reallocated automatically and the previous values will be |
188 | | /// lost. |
| 188 | /// Resizes the digraph. The function will fully destroy and |
| 189 | /// rebuild the digraph. This cause that the maps of the digraph will |
| 190 | /// reallocated automatically and the previous values will be lost. |
189 | 191 | void resize(int n) { |
190 | 192 | Parent::notifier(Arc()).clear(); |
191 | 193 | Parent::notifier(Node()).clear(); |
… |
… |
|
196 | 198 | |
197 | 199 | /// \brief Returns the node with the given index. |
198 | 200 | /// |
199 | | /// Returns the node with the given index. Because it is a |
200 | | /// static size digraph the node's of the digraph can be indexed |
201 | | /// in the range <tt>[0..nodeNum()-1]</tt> and the index of |
202 | | /// the node can accessed by the \e index() member. |
| 201 | /// Returns the node with the given index. Since it is a static |
| 202 | /// digraph its nodes can be indexed with integers from the range |
| 203 | /// <tt>[0..nodeNum()-1]</tt>. |
| 204 | /// \sa index() |
203 | 205 | Node operator()(int ix) const { return Parent::operator()(ix); } |
204 | 206 | |
205 | | /// \brief Returns the index of the node. |
| 207 | /// \brief Returns the index of the given node. |
206 | 208 | /// |
207 | | /// Returns the index of the node. Because it is a |
208 | | /// static size digraph the node's of the digraph can be indexed |
209 | | /// in the range <tt>[0..nodeNum()-1]</tt> and the index of |
210 | | /// the node can accessed by the \e index() member. |
| 209 | /// Returns the index of the given node. Since it is a static |
| 210 | /// digraph its nodes can be indexed with integers from the range |
| 211 | /// <tt>[0..nodeNum()-1]</tt>. |
| 212 | /// \sa operator() |
211 | 213 | int index(const Node& node) const { return Parent::index(node); } |
212 | 214 | |
213 | | /// \brief Returns the arc connects the given nodes. |
| 215 | /// \brief Returns the arc connecting the given nodes. |
214 | 216 | /// |
215 | | /// Returns the arc connects the given nodes. |
| 217 | /// Returns the arc connecting the given nodes. |
216 | 218 | Arc arc(const Node& u, const Node& v) const { |
217 | 219 | return Parent::arc(u, v); |
218 | 220 | } |
… |
… |
|
279 | 281 | } |
280 | 282 | |
281 | 283 | public: |
282 | | |
283 | 284 | |
284 | 285 | Node operator()(int ix) const { return Node(ix); } |
285 | 286 | int index(const Node& node) const { return node._id; } |
… |
… |
|
367 | 368 | |
368 | 369 | class Edge { |
369 | 370 | friend class FullGraphBase; |
| 371 | friend class Arc; |
370 | 372 | |
371 | 373 | protected: |
372 | 374 | int _id; |
… |
… |
|
518 | 520 | /// |
519 | 521 | /// This is a simple and fast undirected full graph |
520 | 522 | /// implementation. From each node go edge to each other node, |
521 | | /// therefore the number of edges in the graph is |
522 | | /// <tt>n(n-1)/2</tt>. It is completely static, so you can neither |
523 | | /// add nor delete either edges or nodes, and it needs just constant |
| 523 | /// therefore the number of edges in the graph is \f$n(n-1)/2\f$. |
| 524 | /// This graph type is completely static, so you can neither |
| 525 | /// add nor delete either edges or nodes, and it needs constant |
524 | 526 | /// space in memory. |
525 | 527 | /// |
526 | | /// The \e FullDigraph and \e FullGraph classes are very similar, |
527 | | /// but there are two differences. While the \e FullDigraph class is |
528 | | /// conform just to the \ref concepts::Digraph "Digraph" concept, |
529 | | /// this class is conform to the \ref concepts::Graph "Graph" |
530 | | /// concept. In addition, the \e FullGraph class does not contain a |
531 | | /// loop arc from each node as the \e FullDigraph does. |
| 528 | /// This class conforms to the \ref concepts::Graph "Graph" concept |
| 529 | /// and it also has an important extra feature that its maps are |
| 530 | /// real \ref concepts::ReferenceMap "reference map"s. |
532 | 531 | /// |
533 | | /// It also has an important extra feature that its maps are real |
534 | | /// \ref concepts::ReferenceMap "reference map"s. |
| 532 | /// The \c FullGraph and \c FullDigraph classes are very similar, |
| 533 | /// but there are two differences. While the \c FullDigraph class |
| 534 | /// conforms only to the \ref concepts::Digraph "Digraph" concept, |
| 535 | /// this class conforms to the \ref concepts::Graph "Graph" concept, |
| 536 | /// moreover \c FullGraph does not contain a loop arc for each |
| 537 | /// node as \c FullDigraph does. |
535 | 538 | /// |
536 | 539 | /// \sa FullDigraph |
537 | 540 | class FullGraph : public ExtendedFullGraphBase { |
… |
… |
|
544 | 547 | |
545 | 548 | /// \brief Constructor |
546 | 549 | /// |
| 550 | /// Constructor. |
547 | 551 | /// \param n The number of the nodes. |
548 | 552 | FullGraph(int n) { construct(n); } |
549 | 553 | |
550 | | /// \brief Resize the graph |
| 554 | /// \brief Resizes the graph |
551 | 555 | /// |
552 | | /// Resize the graph. The function will fully destroy and rebuild |
553 | | /// the graph. This cause that the maps of the graph will |
554 | | /// reallocated automatically and the previous values will be |
555 | | /// lost. |
| 556 | /// Resizes the graph. The function will fully destroy and |
| 557 | /// rebuild the graph. This cause that the maps of the graph will |
| 558 | /// reallocated automatically and the previous values will be lost. |
556 | 559 | void resize(int n) { |
557 | 560 | Parent::notifier(Arc()).clear(); |
558 | 561 | Parent::notifier(Edge()).clear(); |
… |
… |
|
565 | 568 | |
566 | 569 | /// \brief Returns the node with the given index. |
567 | 570 | /// |
568 | | /// Returns the node with the given index. Because it is a static |
569 | | /// size graph the node's of the graph can be indexed in the range |
570 | | /// <tt>[0..nodeNum()-1]</tt> and the index of the node can |
571 | | /// accessed by the \e index() member. |
| 571 | /// Returns the node with the given index. Since it is a static |
| 572 | /// graph its nodes can be indexed with integers from the range |
| 573 | /// <tt>[0..nodeNum()-1]</tt>. |
| 574 | /// \sa index() |
572 | 575 | Node operator()(int ix) const { return Parent::operator()(ix); } |
573 | 576 | |
574 | | /// \brief Returns the index of the node. |
| 577 | /// \brief Returns the index of the given node. |
575 | 578 | /// |
576 | | /// Returns the index of the node. Because it is a static size |
577 | | /// graph the node's of the graph can be indexed in the range |
578 | | /// <tt>[0..nodeNum()-1]</tt> and the index of the node can |
579 | | /// accessed by the \e index() member. |
| 579 | /// Returns the index of the given node. Since it is a static |
| 580 | /// graph its nodes can be indexed with integers from the range |
| 581 | /// <tt>[0..nodeNum()-1]</tt>. |
| 582 | /// \sa operator() |
580 | 583 | int index(const Node& node) const { return Parent::index(node); } |
581 | 584 | |
582 | | /// \brief Number of nodes. |
583 | | int nodeNum() const { return Parent::nodeNum(); } |
584 | | /// \brief Number of arcs. |
585 | | int arcNum() const { return Parent::arcNum(); } |
586 | | /// \brief Number of edges. |
587 | | int edgeNum() const { return Parent::edgeNum(); } |
588 | | |
589 | | /// \brief Returns the arc connects the given nodes. |
| 585 | /// \brief Returns the arc connecting the given nodes. |
590 | 586 | /// |
591 | | /// Returns the arc connects the given nodes. |
| 587 | /// Returns the arc connecting the given nodes. |
592 | 588 | Arc arc(const Node& s, const Node& t) const { |
593 | 589 | return Parent::arc(s, t); |
594 | 590 | } |
… |
… |
|
599 | 595 | Edge edge(const Node& u, const Node& v) const { |
600 | 596 | return Parent::edge(u, v); |
601 | 597 | } |
| 598 | |
| 599 | /// \brief Number of nodes. |
| 600 | int nodeNum() const { return Parent::nodeNum(); } |
| 601 | /// \brief Number of arcs. |
| 602 | int arcNum() const { return Parent::arcNum(); } |
| 603 | /// \brief Number of edges. |
| 604 | int edgeNum() const { return Parent::edgeNum(); } |
| 605 | |
602 | 606 | }; |
603 | 607 | |
604 | 608 | |
diff --git a/test/digraph_test.cc b/test/digraph_test.cc
a
|
b
|
|
142 | 142 | checkConcept<ExtendableDigraphComponent<>, SmartDigraph>(); |
143 | 143 | checkConcept<ClearableDigraphComponent<>, SmartDigraph>(); |
144 | 144 | } |
145 | | // { // Checking FullDigraph |
146 | | // checkConcept<Digraph, FullDigraph>(); |
147 | | // } |
| 145 | { // Checking FullDigraph |
| 146 | checkConcept<Digraph, FullDigraph>(); |
| 147 | } |
148 | 148 | // { // Checking HyperCubeDigraph |
149 | 149 | // checkConcept<Digraph, HyperCubeDigraph>(); |
150 | 150 | // } |