node_matrix.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  node_matrix.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_NODE_MATRIX_H
  12. #define LEDA_NODE_MATRIX_H
  13. //------------------------------------------------------------------------------
  14. // node matrices
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/graph.h>
  17. #include <LEDA/node_array.h>
  18. class Node_Matrix {
  19. graph* g;
  20. node_array<graph_map*> M;
  21. virtual void init_entry(GenPtr&)  { }
  22. virtual void copy_entry(GenPtr&)  const { }
  23. virtual void clear_entry(GenPtr&) const { }
  24. public:
  25.  graph_map& row(node v)               { return *(M[v]); }
  26.  GenPtr&    entry(node v, node w)     { return M[v]->array_access(w); }
  27.  GenPtr     inf(node v, node w) const { return M[v]->array_read(w); }
  28.  void init(const graph&, int, GenPtr);
  29.  void init(const Node_Matrix&);
  30.  void clear_entries();
  31.  Node_Matrix()  {}
  32.  virtual ~Node_Matrix();
  33. };
  34. /*{Manpage {node_matrix} {E} {Two Dimensional Node Arrays}}*/
  35. template<class E>
  36. class node_matrix: public Node_Matrix {
  37. /*{Mdefinition
  38. An instance $M$ of the parameterized data type name is
  39. a partial mapping from the set of node pairs $Vtimes V$
  40. of a graph to the set of variables of data type $E$, called the element type
  41. of $M$. The domain $I$ of $M$ is called the index set of $M$. $M$ is said to
  42. be valid for all node pairs in $I$. A node matrix can also be viewed as a
  43. node array with element type $node_array<E>$ ($node_array<node_array<E>>$).
  44. }*/
  45. E X;
  46. void copy_entry(GenPtr& x) const { LEDA_COPY(E,x); }
  47. void clear_entry(GenPtr& x)const { LEDA_CLEAR(E,x);  }
  48. void init_entry(GenPtr& x)       { x = Copy(X);   }
  49. public:
  50. /*{Mcreation M }*/
  51. node_matrix() {}
  52. /*{Mcreate creates an instance $M$ of type name and initializes the index set
  53. of $M$ to the empty set. }*/
  54. node_matrix(const graph& G)                 { init(G);   }
  55. /*{Mcreate creates an instance $M$ of type name and initializes the index set
  56. to be the set of all node pairs of graph $G$, i.e., $M$ is made valid for all
  57. pairs in $V times V$ where $V$ is the set of nodes currently contained in $G$.
  58. }*/
  59. node_matrix(const graph& G, E x)         { init(G,x); }
  60. /*{Mcreate creates an instance $M$ of type name and initializes the index set
  61. of $M$ to be the set of all node pairs of graph $G$, i.e., $M$ is made valid 
  62. for all pairs in $V times V$ where $V$ is the set of nodes currently 
  63. contained in $G$.  In addition, $M(v,w)$ is initialized with $x$ for all 
  64. nodes $v,w in V$.}*/
  65. node_matrix(const graph& G, int n, E x)  { init(G,n,x); }
  66.  node_matrix(const node_matrix<E>& M) { init(M); }
  67.  node_matrix<E>& operator=(const node_matrix<E>& M)
  68.                                          { init(M); return *this;}
  69. ~node_matrix() { clear_entries(); }
  70. /*{Moperations 3.2 3.7}*/
  71. void  init(const graph& G)                { init(G,X); }
  72. /*{Mop       sets the index set of $M$ to $Vtimes V$, where  
  73.       $V$ is the set of all nodes of $G$. }*/
  74. void  init(const graph& G, int n, E x) { Node_Matrix::init(G,n,Convert(x)); }
  75. void  init(const graph& G, E x)        { init(G,G.max_node_index()+1,x); }
  76. /*{Mop       sets the index set of $M$ to $Vtimes V$, where
  77.       $V$ is the set of all nodes of $G$ and initializes
  78.       $M(v,w)$ to $x$ for all $v,w in V$.}*/
  79. void  init(const node_matrix<E>& M) { Node_Matrix::init(M); }
  80. node_array<E>& operator[](node v)
  81. { return *(node_array<E>*)&row(v); }
  82. /*{Marrop    returns the node_array  $M(v)$.}*/
  83. E  operator()(node v, node w) const { return LEDA_ACCESS(E,inf(v,w));}
  84. E& operator()(node v, node w)       { return LEDA_ACCESS(E,entry(v,w));}
  85. /*{Mfunop    returns the variable $M(v,w)$.\
  86.       precond $M$ must be valid for $v$ and $w$.}*/
  87. };
  88. /*{Mimplementation
  89. Node matrices for a graph $G$ are implemented by vectors of node arrays and an 
  90. internal numbering of the nodes of $G$. The access operation 
  91. takes constant time, the init operation takes time $O(n^2)$, where $n$ is the 
  92. number of nodes currently contained in $G$. The space requirement is $O(n^2)$.
  93. Note that a node matrix is only valid for the nodes contained in $G$ at the 
  94. moment of the matrix declaration or initialization ($init$). Access operations 
  95. for later added nodes are not allowed.}*/
  96. #endif