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