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