Changeset 2223:590c1b663a27 in lemon-0.x
- Timestamp:
- 09/29/06 13:25:27 (18 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2963
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/full_graph.h
r2162 r2223 36 36 namespace lemon { 37 37 38 /// \brief Base of the FullGrpah.39 ///40 /// Base of the FullGrpah.41 38 class FullGraphBase { 42 39 int _nodeNum; … … 49 46 class Edge; 50 47 48 protected: 49 50 FullGraphBase() {} 51 52 void construct(int n) { _nodeNum = n; _edgeNum = n * n; } 53 51 54 public: 52 53 FullGraphBase() {}54 55 56 ///Creates a full graph with \c n nodes.57 void construct(int n) { _nodeNum = n; _edgeNum = n * n; }58 55 59 56 typedef True NodeNumTag; 60 57 typedef True EdgeNumTag; 61 58 62 /// \brief Returns the node with the given index.63 ///64 /// Returns the node with the given index. Because it is a65 /// static size graph the node's of the graph can be indiced66 /// by the range from 0 to \e nodeNum()-1 and the index of67 /// the node can accessed by the \e index() member.68 59 Node operator()(int index) const { return Node(index); } 69 70 /// \brief Returns the index of the node.71 ///72 /// Returns the index of the node. Because it is a73 /// static size graph the node's of the graph can be indiced74 /// by the range from 0 to \e nodeNum()-1 and the index of75 /// the node can accessed by the \e index() member.76 60 int index(const Node& node) const { return node.id; } 77 61 78 ///Number of nodes. 62 Edge edge(const Node& u, const Node& v) const { 63 return Edge(*this, u.id, v.id); 64 } 65 79 66 int nodeNum() const { return _nodeNum; } 80 ///Number of edges.81 67 int edgeNum() const { return _edgeNum; } 82 68 83 /// Maximum node ID.84 85 /// Maximum node ID.86 ///\sa id(Node)87 69 int maxNodeId() const { return _nodeNum-1; } 88 /// Maximum edge ID.89 90 /// Maximum edge ID.91 ///\sa id(Edge)92 70 int maxEdgeId() const { return _edgeNum-1; } 93 71 … … 96 74 97 75 98 /// Node ID.99 100 /// The ID of a valid Node is a nonnegative integer not greater than101 /// \ref maxNodeId(). The range of the ID's is not surely continuous102 /// and the greatest node ID can be actually less then \ref maxNodeId().103 ///104 /// The ID of the \ref INVALID node is -1.105 ///\return The ID of the node \c v.106 107 76 static int id(Node v) { return v.id; } 108 /// Edge ID.109 110 /// The ID of a valid Edge is a nonnegative integer not greater than111 /// \ref maxEdgeId(). The range of the ID's is not surely continuous112 /// and the greatest edge ID can be actually less then \ref maxEdgeId().113 ///114 /// The ID of the \ref INVALID edge is -1.115 ///\return The ID of the edge \c e.116 77 static int id(Edge e) { return e.id; } 117 78 … … 122 83 typedef True FindEdgeTag; 123 84 124 /// Finds an edge between two nodes.125 126 /// Finds an edge from node \c u to node \c v.127 ///128 /// If \c prev is \ref INVALID (this is the default value), then129 /// It finds the first edge from \c u to \c v. Otherwise it looks for130 /// the next edge from \c u to \c v after \c prev.131 /// \return The found edge or INVALID if there is no such an edge.132 85 Edge findEdge(Node u,Node v, Edge prev = INVALID) const { 133 86 return prev.id == -1 ? Edge(*this, u.id, v.id) : INVALID; … … 218 171 /// \sa concept::Graph. 219 172 /// 220 /// \sa FullGraphBase221 173 /// \sa FullUGraph 222 174 /// … … 246 198 Parent::getNotifier(Edge()).build(); 247 199 } 200 201 /// \brief Returns the node with the given index. 202 /// 203 /// Returns the node with the given index. Because it is a 204 /// static size graph the node's of the graph can be indiced 205 /// by the range from 0 to \e nodeNum()-1 and the index of 206 /// the node can accessed by the \e index() member. 207 Node operator()(int index) const { return Parent::operator()(index); } 208 209 /// \brief Returns the index of the node. 210 /// 211 /// Returns the index of the node. Because it is a 212 /// static size graph the node's of the graph can be indiced 213 /// by the range from 0 to \e nodeNum()-1 and the index of 214 /// the node can accessed by the \e index() member. 215 int index(const Node& node) const { return Parent::index(node); } 216 217 /// \brief Returns the edge connects the given nodes. 218 /// 219 /// Returns the edge connects the given nodes. 220 Edge edge(const Node& u, const Node& v) const { 221 return Parent::edge(u, v); 222 } 223 224 /// \brief Number of nodes. 225 int nodeNum() const { return Parent::nodeNum(); } 226 /// \brief Number of edges. 227 int edgeNum() const { return Parent::edgeNum(); } 248 228 }; 249 229 250 230 251 /// \brief Base of the FullUGrpah.252 ///253 /// Base of the FullUGrpah.254 231 class FullUGraphBase { 255 232 int _nodeNum; … … 262 239 class Edge; 263 240 241 protected: 242 243 FullUGraphBase() {} 244 245 void construct(int n) { _nodeNum = n; _edgeNum = n * (n - 1) / 2; } 246 264 247 public: 265 248 266 FullUGraphBase() {} 267 268 269 ///Creates a full graph with \c n nodes. 270 void construct(int n) { _nodeNum = n; _edgeNum = n * (n - 1) / 2; } 271 272 /// \brief Returns the node with the given index. 273 /// 274 /// Returns the node with the given index. Because it is a 275 /// static size graph the node's of the graph can be indiced 276 /// by the range from 0 to \e nodeNum()-1 and the index of 277 /// the node can accessed by the \e index() member. 249 278 250 Node operator()(int index) const { return Node(index); } 279 280 /// \brief Returns the index of the node.281 ///282 /// Returns the index of the node. Because it is a283 /// static size graph the node's of the graph can be indiced284 /// by the range from 0 to \e nodeNum()-1 and the index of285 /// the node can accessed by the \e index() member.286 251 int index(const Node& node) const { return node.id; } 252 253 Edge edge(const Node& u, const Node& v) const { 254 return Edge(u.id * (u.id - 1) / 2 + v.id); 255 } 287 256 288 257 typedef True NodeNumTag; 289 258 typedef True EdgeNumTag; 290 259 291 ///Number of nodes.292 260 int nodeNum() const { return _nodeNum; } 293 ///Number of edges.294 261 int edgeNum() const { return _edgeNum; } 295 262 296 /// Maximum node ID.297 298 /// Maximum node ID.299 ///\sa id(Node)300 263 int maxNodeId() const { return _nodeNum-1; } 301 /// Maximum edge ID.302 303 /// Maximum edge ID.304 ///\sa id(Edge)305 264 int maxEdgeId() const { return _edgeNum-1; } 306 265 307 /// \brief Returns the node from its \c id.308 ///309 /// Returns the node from its \c id. If there is not node310 /// with the given id the effect of the function is undefinied.311 266 static Node nodeFromId(int id) { return Node(id);} 312 313 /// \brief Returns the edge from its \c id.314 ///315 /// Returns the edge from its \c id. If there is not edge316 /// with the given id the effect of the function is undefinied.317 267 static Edge edgeFromId(int id) { return Edge(id);} 318 268 … … 327 277 } 328 278 329 330 /// \brief Node ID.331 ///332 /// The ID of a valid Node is a nonnegative integer not greater than333 /// \ref maxNodeId(). The range of the ID's is not surely continuous334 /// and the greatest node ID can be actually less then \ref maxNodeId().335 ///336 /// The ID of the \ref INVALID node is -1.337 /// \return The ID of the node \c v.338 339 279 static int id(Node v) { return v.id; } 340 341 /// \brief Edge ID.342 ///343 /// The ID of a valid Edge is a nonnegative integer not greater than344 /// \ref maxEdgeId(). The range of the ID's is not surely continuous345 /// and the greatest edge ID can be actually less then \ref maxEdgeId().346 ///347 /// The ID of the \ref INVALID edge is -1.348 ///\return The ID of the edge \c e.349 280 static int id(Edge e) { return e.id; } 350 281 351 /// \brief Finds an edge between two nodes.352 ///353 /// Finds an edge from node \c u to node \c v.354 ///355 /// If \c prev is \ref INVALID (this is the default value), then356 /// It finds the first edge from \c u to \c v. Otherwise it looks for357 /// the next edge from \c u to \c v after \c prev.358 /// \return The found edge or INVALID if there is no such an edge.359 282 Edge findEdge(Node u, Node v, Edge prev = INVALID) const { 360 283 if (prev.id != -1 || u.id <= v.id) return Edge(-1); … … 457 380 /// it does not contain the loop edges. 458 381 /// 459 /// \sa FullUGraphBase460 382 /// \sa FullGraph 461 383 /// … … 486 408 Parent::getNotifier(Edge()).build(); 487 409 } 410 411 /// \brief Returns the node with the given index. 412 /// 413 /// Returns the node with the given index. Because it is a 414 /// static size graph the node's of the graph can be indiced 415 /// by the range from 0 to \e nodeNum()-1 and the index of 416 /// the node can accessed by the \e index() member. 417 Node operator()(int index) const { return Parent::operator()(index); } 418 419 /// \brief Returns the index of the node. 420 /// 421 /// Returns the index of the node. Because it is a 422 /// static size graph the node's of the graph can be indiced 423 /// by the range from 0 to \e nodeNum()-1 and the index of 424 /// the node can accessed by the \e index() member. 425 int index(const Node& node) const { return Parent::index(node); } 426 427 /// \brief Number of nodes. 428 int nodeNum() const { return Parent::nodeNum(); } 429 /// \brief Number of edges. 430 int edgeNum() const { return Parent::edgeNum(); } 431 /// \brief Number of undirected edges. 432 int uEdgeNum() const { return Parent::uEdgeNum(); } 433 434 /// \brief Returns the edge connects the given nodes. 435 /// 436 /// Returns the edge connects the given nodes. 437 Edge edge(const Node& u, const Node& v) const { 438 if (Parent::index(u) > Parent::index(v)) { 439 return Parent::direct(Parent::edge(u, v), true); 440 } else if (Parent::index(u) == Parent::index(v)) { 441 return INVALID; 442 } else { 443 return Parent::direct(Parent::edge(v, u), false); 444 } 445 } 446 447 /// \brief Returns the undirected edge connects the given nodes. 448 /// 449 /// Returns the undirected edge connects the given nodes. 450 UEdge uEdge(const Node& u, const Node& v) const { 451 if (Parent::index(u) > Parent::index(v)) { 452 return Parent::edge(u, v); 453 } else if (Parent::index(u) == Parent::index(v)) { 454 return INVALID; 455 } else { 456 return Parent::edge(v, u); 457 } 458 } 488 459 }; 489 460 … … 496 467 497 468 int _edgeNum; 469 470 protected: 471 472 FullBpUGraphBase() {} 473 474 void construct(int aNodeNum, int bNodeNum) { 475 _aNodeNum = aNodeNum; 476 _bNodeNum = bNodeNum; 477 _edgeNum = aNodeNum * bNodeNum; 478 } 498 479 499 480 public: … … 534 515 }; 535 516 536 void construct(int aNodeNum, int bNodeNum) { 537 _aNodeNum = aNodeNum; 538 _bNodeNum = bNodeNum; 539 _edgeNum = aNodeNum * bNodeNum; 517 Node aNode(int index) const { return Node(index << 1); } 518 Node bNode(int index) const { return Node((index << 1) + 1); } 519 520 int aNodeIndex(const Node& node) const { return node.id >> 1; } 521 int bNodeIndex(const Node& node) const { return node.id >> 1; } 522 523 UEdge uEdge(const Node& u, const Node& v) const { 524 if (((u.id ^ v.id) & 1) != 1) { 525 return UEdge(-1); 526 } else if ((u.id & 1) == 0) { 527 return UEdge((u.id >> 1) * _bNodeNum + (v.id >> 1)); 528 } else { 529 return UEdge((v.id >> 1) * _bNodeNum + (u.id >> 1)); 530 } 540 531 } 541 532 … … 651 642 } 652 643 653 static Node aNode(int index) {654 return Node(index << 1);655 }656 657 static Node bNode(int index) {658 return Node((index << 1) + 1);659 }660 644 661 645 typedef True NodeNumTag; … … 667 651 int uEdgeNum() const { return _edgeNum; } 668 652 653 654 typedef True FindEdgeTag; 655 UEdge findUEdge(Node u, Node v, UEdge prev = INVALID) const { 656 if (prev.id != -1 || ((u.id ^ v.id) & 1) != 1) { 657 return UEdge(-1); 658 } else if ((u.id & 1) == 0) { 659 return UEdge((u.id >> 1) * _bNodeNum + (v.id >> 1)); 660 } else { 661 return UEdge((v.id >> 1) * _bNodeNum + (u.id >> 1)); 662 } 663 } 664 669 665 }; 670 666 … … 680 676 /// It is completely static, so you can neither add nor delete either 681 677 /// edges or nodes. 682 ///683 /// \sa FullUGraphBase684 /// \sa FullGraph685 678 /// 686 679 /// \author Balazs Dezso … … 701 694 /// \brief Resize the graph 702 695 /// 696 /// Resize the graph 703 697 void resize(int n, int m) { 704 698 Parent::getNotifier(Edge()).clear(); … … 714 708 Parent::getNotifier(Edge()).build(); 715 709 } 710 711 /// \brief Number of nodes. 712 int nodeNum() const { return Parent::nodeNum(); } 713 /// \brief Number of A-nodes. 714 int aNodeNum() const { return Parent::aNodeNum(); } 715 /// \brief Number of B-nodes. 716 int bNodeNum() const { return Parent::bNodeNum(); } 717 /// \brief Number of edges. 718 int edgeNum() const { return Parent::edgeNum(); } 719 /// \brief Number of undirected edges. 720 int uEdgeNum() const { return Parent::uEdgeNum(); } 721 722 723 using Parent::aNode; 724 using Parent::bNode; 725 726 /// \brief Returns the A-node with the given index. 727 /// 728 /// Returns the A-node with the given index. Because it is a 729 /// static size graph the node's of the graph can be indiced 730 /// by the range from 0 to \e aNodeNum()-1 and the index of 731 /// the node can accessed by the \e aNodeIndex() member. 732 Node aNode(int index) const { return Parent::aNode(index); } 733 734 /// \brief Returns the B-node with the given index. 735 /// 736 /// Returns the B-node with the given index. Because it is a 737 /// static size graph the node's of the graph can be indiced 738 /// by the range from 0 to \e bNodeNum()-1 and the index of 739 /// the node can accessed by the \e bNodeIndex() member. 740 Node bNode(int index) const { return Parent::bNode(index); } 741 742 /// \brief Returns the index of the A-node. 743 /// 744 /// Returns the index of the A-node. Because it is a 745 /// static size graph the node's of the graph can be indiced 746 /// by the range from 0 to \e aNodeNum()-1 and the index of 747 /// the node can accessed by the \e aNodeIndex() member. 748 int aNodeIndex(const Node& node) const { return Parent::aNodeIndex(node); } 749 750 /// \brief Returns the index of the B-node. 751 /// 752 /// Returns the index of the B-node. Because it is a 753 /// static size graph the node's of the graph can be indiced 754 /// by the range from 0 to \e bNodeNum()-1 and the index of 755 /// the node can accessed by the \e bNodeIndex() member. 756 int bNodeIndex(const Node& node) const { return Parent::bNodeIndex(node); } 757 758 /// \brief Returns the edge connects the given nodes. 759 /// 760 /// Returns the edge connects the given nodes. 761 Edge edge(const Node& u, const Node& v) const { 762 UEdge uedge = Parent::uEdge(u, v); 763 if (uedge != INVALID) { 764 return Parent::direct(uedge, Parent::aNode(u)); 765 } else { 766 return INVALID; 767 } 768 } 769 770 /// \brief Returns the undirected edge connects the given nodes. 771 /// 772 /// Returns the undirected edge connects the given nodes. 773 UEdge uEdge(const Node& u, const Node& v) const { 774 return Parent::uEdge(u, v); 775 } 716 776 }; 717 777 -
lemon/grid_ugraph.h
r2207 r2223 35 35 namespace lemon { 36 36 37 /// \brief Base graph for GridUGraph.38 ///39 /// Base graph for grid graph. It describes some member functions40 /// which can be used in the GridUGraph.41 ///42 /// \warning Always use the GridUGraph instead of this.43 /// \see GridUGraph44 37 class GridUGraphBase { 45 38 … … 57 50 protected: 58 51 59 /// \brief Creates a grid graph with the given size.60 ///61 /// Creates a grid graph with the given size.62 52 void construct(int width, int height) { 63 53 _height = height; _width = width; … … 66 56 } 67 57 68 /// \brief Gives back the edge goes down from the node.69 ///70 /// Gives back the edge goes down from the node. If there is not71 /// outgoing edge then it gives back INVALID.72 58 Edge _down(Node n) const { 73 59 if (n.id < _nodeNum - _width) { … … 78 64 } 79 65 80 /// \brief Gives back the edge comes from up into the node.81 ///82 /// Gives back the edge comes from up into the node. If there is not83 /// incoming edge then it gives back INVALID.84 66 Edge _up(Node n) const { 85 67 if (n.id >= _width) { … … 90 72 } 91 73 92 /// \brief Gives back the edge goes right from the node.93 ///94 /// Gives back the edge goes right from the node. If there is not95 /// outgoing edge then it gives back INVALID.96 74 Edge _right(Node n) const { 97 75 if (n.id % _width < _width - 1) { … … 102 80 } 103 81 104 /// \brief Gives back the edge comes from left into the node.105 ///106 /// Gives back the edge comes left up into the node. If there is not107 /// incoming edge then it gives back INVALID.108 82 Edge _left(Node n) const { 109 83 if (n.id % _width > 0) { … … 124 98 125 99 126 /// \brief The node on the given position.127 ///128 /// Gives back the node on the given position.129 100 Node operator()(int i, int j) const { 130 101 LEMON_ASSERT(0 <= i && i < width() && 0 <= j && … … 133 104 } 134 105 135 /// \brief Gives back the row index of the node.136 ///137 /// Gives back the row index of the node.138 106 int row(Node n) const { 139 107 return n.id / _width; 140 108 } 141 109 142 /// \brief Gives back the coloumn index of the node.143 ///144 /// Gives back the coloumn index of the node.145 110 int col(Node n) const { 146 111 return n.id % _width; 147 112 } 148 113 149 /// \brief Gives back the width of the graph.150 ///151 /// Gives back the width of the graph.152 114 int width() const { 153 115 return _width; 154 116 } 155 117 156 /// \brief Gives back the height of the graph.157 ///158 /// Gives back the height of the graph.159 118 int height() const { 160 119 return _height; … … 164 123 typedef True EdgeNumTag; 165 124 166 ///Number of nodes.167 125 int nodeNum() const { return _nodeNum; } 168 ///Number of edges.169 126 int edgeNum() const { return _edgeNum; } 170 127 171 /// Maximum node ID.172 173 /// Maximum node ID.174 ///\sa id(Node)175 128 int maxNodeId() const { return nodeNum() - 1; } 176 /// Maximum edge ID.177 178 /// Maximum edge ID.179 ///\sa id(Edge)180 129 int maxEdgeId() const { return edgeNum() - 1; } 181 130 182 /// \brief Gives back the source node of an edge.183 ///184 /// Gives back the source node of an edge.185 131 Node source(Edge e) const { 186 132 if (e.id < _edgeLimit) { … … 192 138 } 193 139 194 /// \brief Gives back the target node of an edge.195 ///196 /// Gives back the target node of an edge.197 140 Node target(Edge e) const { 198 141 if (e.id < _edgeLimit) { … … 204 147 } 205 148 206 /// Node ID.207 208 /// The ID of a valid Node is a nonnegative integer not greater than209 /// \ref maxNodeId(). The range of the ID's is not surely continuous210 /// and the greatest node ID can be actually less then \ref maxNodeId().211 ///212 /// The ID of the \ref INVALID node is -1.213 ///\return The ID of the node \c v.214 215 149 static int id(Node v) { return v.id; } 216 /// Edge ID.217 218 /// The ID of a valid Edge is a nonnegative integer not greater than219 /// \ref maxEdgeId(). The range of the ID's is not surely continuous220 /// and the greatest edge ID can be actually less then \ref maxEdgeId().221 ///222 /// The ID of the \ref INVALID edge is -1.223 ///\return The ID of the edge \c e.224 150 static int id(Edge e) { return e.id; } 225 151 … … 230 156 typedef True FindEdgeTag; 231 157 232 /// Finds an edge between two nodes.233 234 /// Finds an edge from node \c u to node \c v.235 ///236 /// If \c prev is \ref INVALID (this is the default value), then237 /// It finds the first edge from \c u to \c v. Otherwise it looks for238 /// the next edge from \c u to \c v after \c prev.239 /// \return The found edge or INVALID if there is no such an edge.240 158 Edge findEdge(Node u, Node v, Edge prev = INVALID) const { 241 159 if (prev != INVALID) return INVALID; … … 360 278 /// Two nodes are connected in the graph if the indices differ only 361 279 /// on one position and only one is the difference. 280 /// 281 /// \image html grid_ugraph.png 282 /// \image latex grid_ugraph.eps "Grid graph" width=\textwidth 362 283 /// 363 284 /// The graph can be indiced in the following way: … … 376 297 /// 377 298 /// \author Balazs Dezso 378 /// \see GridUGraphBase379 299 class GridUGraph : public ExtendedGridUGraphBase { 380 300 public: … … 477 397 } 478 398 399 /// \brief The node on the given position. 400 /// 401 /// Gives back the node on the given position. 402 Node operator()(int i, int j) const { 403 return Parent::operator()(i, j); 404 } 405 406 /// \brief Gives back the row index of the node. 407 /// 408 /// Gives back the row index of the node. 409 int row(Node n) const { 410 return Parent::row(n); 411 } 412 413 /// \brief Gives back the coloumn index of the node. 414 /// 415 /// Gives back the coloumn index of the node. 416 int col(Node n) const { 417 return Parent::col(n); 418 } 419 420 /// \brief Gives back the width of the graph. 421 /// 422 /// Gives back the width of the graph. 423 int width() const { 424 return Parent::width(); 425 } 426 427 /// \brief Gives back the height of the graph. 428 /// 429 /// Gives back the height of the graph. 430 int height() const { 431 return Parent::height(); 432 } 433 479 434 /// \brief Gives back the edge goes down from the node. 480 435 /// -
lemon/hypercube_graph.h
r2207 r2223 35 35 namespace lemon { 36 36 37 /// \brief Base graph for HyperCubeGraph.38 ///39 /// Base graph for hyper-cube graph. It describes some member functions40 /// which can be used in the HyperCubeGraph.41 ///42 /// \warning Always use the HyperCubeGraph instead of this.43 /// \see HyperCubeGraph44 37 class HyperCubeGraphBase { 45 38 … … 57 50 protected: 58 51 59 /// \brief Creates a hypercube graph with the given size.60 ///61 /// Creates a hypercube graph with the given size.62 52 void construct(int dim) { 63 53 _dim = dim; … … 71 61 typedef True EdgeNumTag; 72 62 73 ///Number of nodes.74 63 int nodeNum() const { return _nodeNum; } 75 ///Number of edges.76 64 int edgeNum() const { return _nodeNum * _dim; } 77 65 78 /// Maximum node ID.79 80 /// Maximum node ID.81 ///\sa id(Node)82 66 int maxNodeId() const { return nodeNum() - 1; } 83 /// Maximum edge ID.84 85 /// Maximum edge ID.86 ///\sa id(Edge)87 67 int maxEdgeId() const { return edgeNum() - 1; } 88 68 89 /// \brief Gives back the source node of an edge.90 ///91 /// Gives back the source node of an edge.92 69 Node source(Edge e) const { 93 70 return e.id / _dim; 94 71 } 95 72 96 /// \brief Gives back the target node of an edge.97 ///98 /// Gives back the target node of an edge.99 73 Node target(Edge e) const { 100 74 return (e.id / _dim) ^ ( 1 << (e.id % _dim)); 101 75 } 102 76 103 /// Node ID.104 105 /// The ID of a valid Node is a nonnegative integer not greater than106 /// \ref maxNodeId(). The range of the ID's is not surely continuous107 /// and the greatest node ID can be actually less then \ref maxNodeId().108 ///109 /// The ID of the \ref INVALID node is -1.110 ///\return The ID of the node \c v.111 112 77 static int id(Node v) { return v.id; } 113 /// Edge ID.114 115 /// The ID of a valid Edge is a nonnegative integer not greater than116 /// \ref maxEdgeId(). The range of the ID's is not surely continuous117 /// and the greatest edge ID can be actually less then \ref maxEdgeId().118 ///119 /// The ID of the \ref INVALID edge is -1.120 ///\return The ID of the edge \c e.121 78 static int id(Edge e) { return e.id; } 122 79 … … 193 150 } 194 151 195 /// \brief Gives back the number of the dimensions.196 ///197 /// Gives back the number of the dimensions.198 152 int dimension() const { 199 153 return _dim; 200 154 } 201 155 202 /// \brief Returns true if the n'th bit of the node is one.203 ///204 /// Returns true if the n'th bit of the node is one.205 156 bool projection(Node node, int n) const { 206 157 return (bool)(node.id & (1 << n)); 207 158 } 208 159 209 /// \brief The dimension id of the edge.210 ///211 /// It returns the dimension id of the edge. It can212 /// be in the ${0, 1, dim-1}$ intervall.213 160 int dimension(Edge edge) const { 214 161 return edge.id % _dim; 215 162 } 216 163 217 /// \brief Gives back the index of the node.218 ///219 /// Gives back the index of the node. The lower bits of the220 /// integer describe the node.221 164 int index(Node node) const { 222 165 return node.id; 223 166 } 224 167 225 /// \brief Gives back the node by its index.226 ///227 /// Gives back the node by its index.228 168 Node operator()(int index) const { 229 169 return Node(index); … … 253 193 /// concept but it does not conform to the \ref concept::UGraph. 254 194 /// 255 /// \see HyperCubeGraphBase256 195 /// \author Balazs Dezso 257 196 class HyperCubeGraph : public ExtendedHyperCubeGraphBase { 258 197 public: 259 198 199 typedef ExtendedHyperCubeGraphBase Parent; 200 260 201 /// \brief Construct a graph with \c dim dimension. 261 202 /// 262 203 /// Construct a graph with \c dim dimension. 263 204 HyperCubeGraph(int dim) { construct(dim); } 205 206 /// \brief Gives back the number of the dimensions. 207 /// 208 /// Gives back the number of the dimensions. 209 int dimension() const { 210 return Parent::dimension(); 211 } 212 213 /// \brief Returns true if the n'th bit of the node is one. 214 /// 215 /// Returns true if the n'th bit of the node is one. 216 bool projection(Node node, int n) const { 217 return Parent::projection(node, n); 218 } 219 220 /// \brief The dimension id of the edge. 221 /// 222 /// It returns the dimension id of the edge. It can 223 /// be in the \f$ \{0, 1, \dots, dim-1\} \f$ intervall. 224 int dimension(Edge edge) const { 225 return Parent::dimension(edge); 226 } 227 228 /// \brief Gives back the index of the node. 229 /// 230 /// Gives back the index of the node. The lower bits of the 231 /// integer describes the node. 232 int index(Node node) const { 233 return Parent::index(node); 234 } 235 236 /// \brief Gives back the node by its index. 237 /// 238 /// Gives back the node by its index. 239 Node operator()(int index) const { 240 return Parent::operator()(index); 241 } 242 243 /// \brief Number of nodes. 244 int nodeNum() const { return Parent::nodeNum(); } 245 /// \brief Number of edges. 246 int edgeNum() const { return Parent::edgeNum(); } 264 247 265 248 /// \brief Linear combination map.
Note: See TracChangeset
for help on using the changeset viewer.