| 
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
  |