src/work/alpar/attic/texi/flf-graph.texi
author deba
Wed, 08 Sep 2004 12:06:45 +0000
changeset 822 88226d9fe821
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

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