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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  node_array.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_ARRAY_H
  12. #define LEDA_NODE_ARRAY_H
  13. //------------------------------------------------------------------------------
  14. // node arrays
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/graph.h>
  17. /*{Manpage {node_array} {E} {Node Arrays}}*/
  18. template <class E>
  19. class node_array : public graph_map
  20. {
  21. /*{Mdefinition
  22. An instance $A$ of the parameterized data type $node_array<E>$
  23. is a partial mapping from the node set of a graph $G$ to the set of 
  24. variables of type $E$, called the element type of the array. The domain 
  25. $I$ of $A$ is called the index set of $A$ and $A(v)$ is called the element 
  26. at position $v$. $A$ is said to be valid for all nodes in $I$.}*/
  27. E def;
  28. void clear_entry(GenPtr& x) const { LEDA_CLEAR(E,x); }
  29. void copy_entry(GenPtr& x)  const { LEDA_COPY(E,x);  }
  30. void init_entry(GenPtr& x)  const { x = Copy(def); }
  31.   
  32. public:
  33. int cmp_entry(GenPtr p,GenPtr q) const { return LEDA_COMPARE(E,p,q); }
  34. /*{Mcreation A }*/
  35. node_array() : graph_map(nil,0) {}
  36. /*{Mcreate creates an instance $A$ of type $node_array<E>$ with empty
  37.             index set.}*/
  38. node_array(const graph& G) : graph_map(&G,G.max_node_index()+1)
  39. { init_table(); }
  40. /*{Mcreate creates an instance $A$ of type $node_array<E>$ and initializes
  41.             the index set of $A$ to the current node set of graph $G$. }*/
  42. node_array(const graph& G, E x) : graph_map(&G,G.max_node_index()+1)
  43. { def = x; init_table(); }
  44. /*{Mcreate creates an instance $A$ of type $node_array<E>$, sets the
  45.             index set of $A$ to the current node set of graph $G$ and 
  46.             initializes $A(v)$ with $x$ for all nodes $v$ of $G$. }*/
  47. node_array(const graph& G, int n, E x) : graph_map(&G,n)
  48. { def = x; init_table(); }
  49. /*{Mcreate creates an instance $A$ of type $node_array<E>$ valid for
  50.             up to $n$ nodes of graph $G$ and initializes $A(v)$ with $x$ 
  51.             for all nodes $v$ of $G$.\
  52.     precond $n ge |V|$. $A$ is also
  53.             valid for the next $n - |V|$ nodes added to $G$.}*/
  54. node_array(const node_array<E>& A) : graph_map(A)   {}
  55. node_array<E>& operator=(const node_array<E>& A) 
  56. { graph_map::operator=(A);  
  57.   return *this;
  58.  }
  59. ~node_array() { clear_table(); }
  60. /*{Moperations 1.3 4.7 }*/
  61. E  operator[](node v) const {  return LEDA_ACCESS(E,graph_map::array_read(v)); }
  62. E& operator[](node v) {  return LEDA_ACCESS(E,graph_map::array_access(v)); }
  63. /*{Marrop    returns the variable $A(v)$.\
  64.       precond $A$ must be valid for $v$.}*/
  65. E& entry(int i)      { return LEDA_ACCESS(E,graph_map::access(i));}
  66. E  inf(int i)  const { return LEDA_ACCESS(E,graph_map::read(i));}
  67. E& entry(node v)     {  return LEDA_ACCESS(E,graph_map::array_access(v)); }
  68. E  inf(node v) const {  return LEDA_ACCESS(E,graph_map::array_read(v)); }
  69. void init()  { graph_map::init(nil,1); }
  70. void init(const graph& G)      
  71. { graph_map::init(&G,G.max_node_index()+1); 
  72.   init_table();
  73.  }
  74. /*{Mop       sets the index set $I$ of $A$ to the node  
  75.       set of $G$, i.e., makes $A$ valid for all nodes 
  76.               of $G$.}*/
  77. void init(const graph& G, E x) 
  78. { graph_map::init(&G,G.max_node_index()+1); 
  79.   def = x;
  80.   init_table();
  81. }
  82. /*{Mop       makes $A$ valid for all nodes of $G$
  83.       and sets $A(v) = x$ for all nodes $v$ of $G$.}*/
  84. void init(const graph& G, int n, E x) 
  85. { graph_map::init(&G,n); 
  86.   def = x;
  87.   init_table();
  88. }
  89. /*{Mop       makes $A$ valid for at most $n$ nodes  of $G$ 
  90.               and sets $A(v) = x$ for all nodes $v$  of $G$.
  91.               precond {$n ge |V|$}. $A$ is also valid for 
  92.               the next  $n - |V|$ nodes added to $G$. }*/
  93. /*{Mimplementation
  94. Node arrays for a graph $G$ are implemented by CC vectors and an
  95. internal numbering of the nodes and edges of $G$. The access operation
  96. takes constant time, $init$ takes time $O(n)$, where $n$ is the number of
  97. nodes in $G$. The space requirement is $O(n)$.
  98.     
  99. {bf Remark}: A node array is only valid for a bounded number of
  100. nodes of $G$. This number is either the number
  101. of nodes of $G$ at the moment of creation of the array or it is explicitely 
  102. set by the user. Dynamic node arrays can be realized by node 
  103. maps (cf. section ref{Node Maps}). }*/
  104. };
  105. #endif