|
1 @node The Full Feature Graph Class |
|
2 @section The Full Feature Graph Class |
|
3 @cindex Full Feature Graph Class |
|
4 |
|
5 This section describes what an imaginary full feature graph class knows. |
|
6 The set of features provided by a real graph implementation is typically |
|
7 a subset of the features below. |
|
8 |
|
9 On the other hand, each graph algorithm requires the underlying graph |
|
10 structure to provide a certain (typically small) set of features in order |
|
11 to be able to run. |
|
12 |
|
13 @subsection Declaration |
|
14 |
|
15 @deftp {Class} {class Graph} |
|
16 @code{Graph} is the imaginary @emph{full feature graph class}. |
|
17 @code{G} denotes the instance of this class in the exaples below. |
|
18 @c Each node and edge has a user defined data sturcure |
|
19 @c @var{N} and @var{E} statically attached to it. |
|
20 @end deftp |
|
21 |
|
22 @subsection Types |
|
23 |
|
24 @c @deftp {Type} Graph::NodeType |
|
25 @c @deftpx {Type} Graph::EdgeType |
|
26 @c The type of the data stored statically for each node and edge. |
|
27 @c @end deftp |
|
28 |
|
29 @anchor{Graph-NodeIterator} |
|
30 @deftp {Type} Graph::NodeIt |
|
31 @c @deftpx {Type} Graph::NodeIterator |
|
32 These types points a node uniquely. The difference between the |
|
33 @code{NodeIt} and the @code{NodeIterator} is that @code{NodeIt} |
|
34 requires the graph structure itself for most of the operations. |
|
35 For examples using iterators you can go through all nodes as follows. |
|
36 @quotation |
|
37 @verbatim |
|
38 Graph G; |
|
39 int nodenum=0; |
|
40 for(Graph::NodeIterator n(G);n.valid();++n) ++nodenum; |
|
41 @end verbatim |
|
42 @end quotation |
|
43 Using @code{NodeIt} the last line looks like this. |
|
44 @quotation |
|
45 @verbatim |
|
46 for(Graph::NodeIt n(G);n.valid();n=G.next(n)) ++nodenum; |
|
47 @end verbatim |
|
48 @end quotation |
|
49 or |
|
50 @quotation |
|
51 @verbatim |
|
52 MyGraph::NodeIt n; |
|
53 for(G.getFirst(n);G.valid(n);G.goNext(n)) ++nodenum; |
|
54 @end verbatim |
|
55 @end quotation |
|
56 @end deftp |
|
57 |
|
58 @deftp {Type} Graph::EdgeIt |
|
59 @deftpx {Type} Graph::InEdgeIt |
|
60 @deftpx {Type} Graph::OutEdgeIt |
|
61 @deftpx {Type} Graph::EachEdgeIt |
|
62 @c @deftpx {Type} Graph::BiEdgeIt |
|
63 @c @deftpx {Type} Graph::SymEdgeIt |
|
64 Each of these types points an edge uniquely. The difference between the |
|
65 @code{EdgeIt} and the |
|
66 @c @mref{Graph-NodeIterator,@code{EdgeIterator}} |
|
67 @mref{Graph-NodeIterator , EdgeIterator} |
|
68 series is that |
|
69 @code{EdgeIt} requires the graph structure itself for most of the |
|
70 operations. |
|
71 @end deftp |
|
72 |
|
73 @anchor{Graph-EdgeIterator} |
|
74 @c @deftp {Type} Graph::EdgeIterator |
|
75 @c @deftpx {Type} Graph::InEdgeIterator |
|
76 @c @deftpx {Type} Graph::OutEdgeIterator |
|
77 @c @deftpx {Type} Graph::BiEdgeIterator |
|
78 @c @deftpx {Type} Graph::SymEdgeIterator |
|
79 @c @deftpx {Type} Graph::EachEdgeIterator |
|
80 @c Each of these types points an edge uniquely. The difference between the |
|
81 @c @code{EdgeIt} and the @code{EdgeIterator} series is that |
|
82 @c @code{EdgeIt} requires the graph structure itself for most of the |
|
83 @c operations. |
|
84 |
|
85 @c For the @code{EdgeIterator} types you can use operator @code{++} |
|
86 @c (both the prefix and the posfix one) to obtain the next edge. |
|
87 @c @end deftp |
|
88 |
|
89 @deftp {Type} Graph::NodeMap<typename T> |
|
90 @deftpx {Type} Graph::EdgeMap<typename T> |
|
91 There are the default property maps for the edges and the nodes. |
|
92 @end deftp |
|
93 |
|
94 @deftp {Type} Graph::DynNodeMap<typename T> |
|
95 @deftpx {Type} Graph::DynEdgeMap<typename T> |
|
96 There are the default @emph{dynamic} property maps for the edges and the nodes. |
|
97 @end deftp |
|
98 |
|
99 @subsection Member Functions |
|
100 |
|
101 @subsubsection Constructors |
|
102 |
|
103 @deftypefun { } Graph::Graph () |
|
104 The default constructor. |
|
105 @end deftypefun |
|
106 |
|
107 @c @deftypefun { } Graph::Graph (Graph@tie{}&) |
|
108 @deftypefun { } Graph::Graph (Graph &) |
|
109 The copy constructor. |
|
110 @end deftypefun |
|
111 |
|
112 @subsubsection Graph Maintenence Operations |
|
113 |
|
114 @deftypefun NodeIt Graph::addNode () |
|
115 Adds a new node to the graph and returns a @code{NodeIt} pointing to it. |
|
116 @end deftypefun |
|
117 |
|
118 @deftypefun EdgeIt Graph::addEdge (@w{const @mref{Graph-NodeIterator,NodeIt} @var{from}}, @w{const @mref{Graph-NodeIterator,NodeIt} @var{to}}) |
|
119 Adds a new edge with tail @var{from} and head @var{to} to the graph |
|
120 and returns an @code{EdgeIt} pointing to it. |
|
121 @end deftypefun |
|
122 |
|
123 @deftypefun void Graph::delete (@w{const @mref{Graph-NodeIterator,NodeIt} @var{n}}) |
|
124 Deletes the node @var{n}. It also deletes the adjacent edges. |
|
125 @end deftypefun |
|
126 |
|
127 @deftypefun void Graph::delete (@w{const @mref{Graph-EdgeIterator,EdgeIt} @var{e}}) |
|
128 Deletes the edge @var{n}. |
|
129 @end deftypefun |
|
130 |
|
131 @deftypefun void Graph::clear () |
|
132 Deletes all edges and nodes from the graph. |
|
133 @end deftypefun |
|
134 |
|
135 @deftypefun int Graph::nodeNum () |
|
136 Returns the number of the nodes in the graph. |
|
137 ??? Is it necessary??? |
|
138 @end deftypefun |
|
139 |
|
140 @subsubsection NodeIt Operations |
|
141 |
|
142 @deftypefun NodeIt Graph::getFirst (NodeIt &@var{n}) const |
|
143 @deftypefunx NodeIt Graph::getNext (NodeIt @var{n}) const |
|
144 @deftypefunx {NodeIt &} Graph::next (NodeIt &@var{n}) |
|
145 The nodes in the graph forms a list. @code{getFirst(n)} sets @var{n} to |
|
146 be the first node. @code{getNext(n)} gives back the subsequent |
|
147 node. @code{next(n)} is equivalent to @code{n=getNext(n)}, though it |
|
148 might be faster. ??? What should be the return value ??? |
|
149 @end deftypefun |
|
150 |
|
151 @deftypefun bool Graph::valid (NodeIt &@var{e}) |
|
152 @c @deftypefunx bool NodeIt::valid () |
|
153 These functions check if and NodeIt is valid or not. |
|
154 @c ??? Which one should be implemented ??? |
|
155 @end deftypefun |
|
156 |
|
157 @subsubsection EdgeIt Operations |
|
158 |
|
159 @deftypefun EachEdgeIt Graph::getFirst (const EachEdgeIt & @var{e}) const |
|
160 @deftypefunx EachEdgeIt Graph::getNext (EachEdgeIt @var{n}) const |
|
161 @deftypefunx {EachEdgeIt &} Graph::next (EachEdgeIt &@var{n}) |
|
162 With these functions you can go though all the edges of the graph. |
|
163 @c ??? What should be the return value ??? |
|
164 @end deftypefun |
|
165 |
|
166 @deftypefun InEdgeIt &Graph::getFirst (InEdgeIt & @var{e}, const NodeIt @var{n}) |
|
167 @deftypefunx OutEdgeIt &Graph::getFirst (OutEdgeIt & @var{e}, const NodeIt @var{n}) |
|
168 @c @deftypefunx SymEdgeIt &Graph::getFirst (SymEdgeIt & @var{e}, const NodeIt @var{n}) |
|
169 The edges leaving from |
|
170 or |
|
171 arriving at |
|
172 @c or adjacent with |
|
173 a node forms a |
|
174 list. These functions give back the first elements of these |
|
175 lists. The exact behavior depends on the type of @var{e}. |
|
176 |
|
177 If @var{e} is an @code{InEdgeIt} or an @code{OutEdgeIt} then |
|
178 @code{getFirst} sets @var{e} to be the first incoming or outgoing edge |
|
179 of the node @var{n}, respectively. |
|
180 |
|
181 @c If @var{e} is a @code{SymEdgeIt} then |
|
182 @c @code{getFirst} sets @var{e} to be the first incoming if there exists one |
|
183 @c otherwise the first outgoing edge. |
|
184 |
|
185 If there are no such edges, @var{e} will be invalid. |
|
186 |
|
187 @end deftypefun |
|
188 |
|
189 @deftypefun InEdgeIt Graph::next (const InEdgeIt @var{e}) |
|
190 @deftypefunx OutEdgeIt Graph::next (const OutEdgeIt @var{e}) |
|
191 @deftypefunx SymEdgeIt Graph::next (const SymEdgeIt @var{e}) |
|
192 These functions give back the edge that follows @var{e} |
|
193 @end deftypefun |
|
194 |
|
195 @deftypefun {InEdgeIt &} Graph::goNext (InEdgeIt &@var{e}) |
|
196 @deftypefunx {OutEdgeIt &} Graph::goNext (OutEdgeIt &@var{e}) |
|
197 @deftypefunx {SymEdgeIt &} Graph::goNext (SymEdgeIt &@var{e}) |
|
198 @code{G.goNext(e)} is equivalent to @code{e=G.next(e)}, though it |
|
199 might be faster. |
|
200 ??? What should be the return value ??? |
|
201 @end deftypefun |
|
202 |
|
203 @deftypefun bool Graph::valid (EdgeIt &@var{e}) |
|
204 @deftypefunx bool EdgeIt::valid () |
|
205 These functions check if and EdgeIt is valid or not. |
|
206 ??? Which one should be implemented ??? |
|
207 @end deftypefun |
|
208 |
|
209 @deftypefun NodeIt Graph::tail (const EdgeIt @var{e}) |
|
210 @deftypefunx NodeIt Graph::head (const EdgeIt @var{e}) |
|
211 @deftypefunx NodeIt Graph::aNode (const InEdgeIt @var{e}) |
|
212 @deftypefunx NodeIt Graph::aNode (const OutEdgeIt @var{e}) |
|
213 @deftypefunx NodeIt Graph::aNode (const SymEdgeIt @var{e}) |
|
214 @deftypefunx NodeIt Graph::bNode (const InEdgeIt @var{e}) |
|
215 @deftypefunx NodeIt Graph::bNode (const OutEdgeIt @var{e}) |
|
216 @deftypefunx NodeIt Graph::bNode (const SymEdgeIt @var{e}) |
|
217 There queries give back the two endpoints of the edge @var{e}. For a |
|
218 directed edge @var{e}, @code{tail(e)} and @code{head(e)} is its tail and |
|
219 its head, respectively. For an undirected @var{e}, they are two |
|
220 endpoints, but you should not rely on which end is which. |
|
221 |
|
222 @code{aNode(e)} is the node which @var{e} is bounded to, i.e. it is |
|
223 equal to @code{tail(e)} if @var{e} is an @code{OutEdgeIt} and |
|
224 @code{head(e)} if @var{e} is an @code{InEdgeIt}. If @var{e} is a |
|
225 @code{SymEdgeIt} and it or its first preceding edge was created by |
|
226 @code{getFirst(e,n)}, then @code{aNode(e)} is equal to @var{n}. |
|
227 |
|
228 @code{bNode(e)} is the other end of the edge. |
|
229 |
|
230 @deftypefun void Graph::setInvalid (EdgeIt &@var{e}) |
|
231 @deftypefunx void Graph::setInvalid (EdgeIt &@var{e}) |
|
232 These functions set the corresponding iterator to be invalid. |
|
233 @end deftypefun |
|
234 |
|
235 @c ???It is implemented in an other way now. (Member function <-> Graph global)??? |
|
236 @end deftypefun |
|
237 |
|
238 |
|
239 |
|
240 @c @deftypevar int from |
|
241 @c the tail of the created edge. |
|
242 @c @end deftypevar |