# 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 | // } |