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

MultiPlatform

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