alpar@18: @node The Full Feature Graph Class alpar@18: @section The Full Feature Graph Class alpar@18: @cindex Full Feature Graph Class alpar@18: alpar@18: This section describes what an imaginary full feature graph class knows. alpar@18: The set of features provided by a real graph implementation is typically alpar@18: a subset of the features below. alpar@18: alpar@18: On the other hand, each graph algorithm requires the underlying graph alpar@18: structure to provide a certain (typically small) set of features in order alpar@18: to be able to run. alpar@18: alpar@18: @subsection Declaration alpar@18: alpar@18: @deftp {Class} {class Graph} alpar@18: @code{Graph} is the imaginary @emph{full feature graph class}. alpar@18: @code{G} denotes the instance of this class in the exaples below. alpar@18: @c Each node and edge has a user defined data sturcure alpar@18: @c @var{N} and @var{E} statically attached to it. alpar@18: @end deftp alpar@18: alpar@18: @subsection Types alpar@18: alpar@18: @deftp {Type} Graph::NodeType alpar@18: @deftpx {Type} Graph::EdgeType alpar@18: The type of the data stored statically for each node and edge. alpar@18: @end deftp alpar@18: alpar@18: @anchor{Graph-NodeIterator} alpar@18: @deftp {Type} Graph::NodePoint alpar@18: @deftpx {Type} Graph::NodeIterator alpar@18: These types points a node uniquely. The difference between the alpar@18: @code{NodePoint} and the @code{NodeIterator} is that @code{NodePoint} alpar@18: requires the graph structure itself for most of the operations. alpar@18: For examples using iterators you can go through all nodes as follows. alpar@18: @quotation alpar@18: @verbatim alpar@18: Graph G; alpar@18: int nodenum=0; alpar@18: for(Graph::NodeIterator n(G);n.Valid();++n) ++nodenum; alpar@18: @end verbatim alpar@18: @end quotation alpar@18: Using @code{NodePoint} the last line looks like this. alpar@18: @quotation alpar@18: @verbatim alpar@18: for(MyGraph::NodePoint n(G);n.Valid();n=G.Next(n)) ++nodenum; alpar@18: @end verbatim alpar@18: @end quotation alpar@18: or alpar@18: @quotation alpar@18: @verbatim alpar@18: MyGraph::NodePoint n; alpar@18: for(G.GetFirst(n);G.Valid(n);G.GoNext(n)) ++nodenum; alpar@18: @end verbatim alpar@18: @end quotation alpar@18: @end deftp alpar@18: alpar@18: @deftp {Type} Graph::EdgePoint alpar@18: @deftpx {Type} Graph::InEdgePoint alpar@18: @deftpx {Type} Graph::OutEdgePoint alpar@18: @deftpx {Type} Graph::BiEdgePoint alpar@18: @deftpx {Type} Graph::SymEdgePoint alpar@18: Each of these types points an edge uniquely. The difference between the alpar@18: @code{EdgePoint} and the alpar@18: @c @mref{Graph-NodeIterator,@code{EdgeIterator}} alpar@18: @mref{Graph-NodeIterator , EdgeIterator} alpar@18: series is that alpar@18: @code{EdgePoint} requires the graph structure itself for most of the alpar@18: operations. alpar@18: @end deftp alpar@18: alpar@18: @anchor{Graph-EdgeIterator} alpar@18: @deftp {Type} Graph::EdgeIterator alpar@18: @deftpx {Type} Graph::InEdgeIterator alpar@18: @deftpx {Type} Graph::OutEdgeIterator alpar@18: @deftpx {Type} Graph::BiEdgeIterator alpar@18: @deftpx {Type} Graph::SymEdgeIterator alpar@18: @deftpx {Type} Graph::AllEdgeIterator alpar@18: Each of these types points an edge uniquely. The difference between the alpar@18: @code{EdgePoint} and the @code{EdgeIterator} series is that alpar@18: @code{EdgePoint} requires the graph structure itself for most of the alpar@18: operations. alpar@18: alpar@18: For the @code{EdgeIterator} types you can use operator @code{++} alpar@18: (both the prefix and the posfix one) to obtain the next edge. alpar@18: @end deftp alpar@18: alpar@18: @deftp {Type} Graph::NodeMap alpar@18: @deftpx {Type} Graph::EdgeMap alpar@18: There are the default property maps for the edges and the nodes. alpar@18: @end deftp alpar@18: alpar@18: alpar@18: @subsection Member Functions alpar@18: alpar@18: @subsubsection Constructors alpar@18: alpar@18: alpar@18: @deftypefun { } Graph::Graph () alpar@18: The default constructor. alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun { } Graph::Graph (Graph@tie{}&) alpar@18: The copy constructor. Not yet implemented. alpar@18: @end deftypefun alpar@18: alpar@18: @subsubsection Graph Maintenence Operations alpar@18: alpar@18: @deftypefun NodeIterator Graph::AddNode () alpar@18: Adds a new node to the graph and returns a @code{NodeIterator} pointing to it. alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun EdgeIterator Graph::AddEdge (@w{const @mref{Graph-NodeIterator,NodeIterator} @var{from}}, @w{const @mref{Graph-NodeIterator,NodeIterator} @var{to}}) alpar@18: Adds a new edge with tail @var{from} and head @var{to} to the graph alpar@18: and returns an @code{EdgeIterator} pointing to it. alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun void Graph::Delete (@w{const @mref{Graph-NodeIterator,NodeIterator} @var{n}}) alpar@18: Deletes the node @var{n}. It also deletes the adjacent edges. alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun void Graph::Delete (@w{const @mref{Graph-EdgeIterator,EdgeIterator} @var{e}}) alpar@18: Deletes the edge @var{n}. alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun void Graph::Clean () alpar@18: Deletes all edges and nodes from the graph. alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun int Graph::NodeNum () alpar@18: Returns the number of the nodes in the graph. alpar@18: @end deftypefun alpar@18: alpar@18: @subsubsection NodePoint Operations alpar@18: alpar@18: @deftypefun NodePoint Graph::GetFirst (NodePoint &@var{n}) alpar@18: @deftypefunx NodePoint Graph::Next (const NodePoint @var{n}) alpar@18: @deftypefunx {NodePoint &} Graph::GoNext (NodePoint &@var{n}) alpar@18: The nodes in the graph forms a list. @code{GetFirst(n)} sets @var{n} to alpar@18: be the first node. @code{Next(n)} gives back the subsequent alpar@18: node. @code{Next(n)} is equivalent to @code{n=Next(n)}, though it alpar@18: might be faster. ??? What should be the return value ??? alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun bool Graph::Valid (NodePoint &@var{e}) alpar@18: @deftypefunx bool NodePoint::Valid () alpar@18: These functions check if and NodePoint is valid or not. alpar@18: ??? Which one should be implemented ??? alpar@18: @end deftypefun alpar@18: alpar@18: @subsubsection EdgePoint Operations alpar@18: alpar@18: @deftypefun AllEdgePoint Graph::GetFirst (const AllEdgePoint & @var{e}) alpar@18: @deftypefunx AllEdgePoint Graph::Next (const AllEdgePoint @var{n}) alpar@18: @deftypefunx {AllEdgePoint &} Graph::GoNext (AllEdgePoint &@var{n}) alpar@18: With these functions you can go though all the edges of the graph. alpar@18: ??? What should be the return value ??? alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun InEdgePoint Graph::GetFirst (const InEdgePoint & @var{e}, const NodePoint @var{n}) alpar@18: @deftypefunx OutEdgePoint Graph::GetFirst (const OutEdgePoint & @var{e}, const NodePoint @var{n}) alpar@18: @deftypefunx SymEdgePoint Graph::GetFirst (const SymEdgePoint & @var{e}, const NodePoint @var{n}) alpar@18: The edges leaving from, arriving at or adjacent with a node forms a alpar@18: list. These functions give back the first elements of these alpar@18: lists. The exact behavior depends on the type of @var{e}. alpar@18: alpar@18: If @var{e} is an @code{InEdgePoint} or an @code{OutEdgePoint} then alpar@18: @code{GetFirst} sets @var{e} to be the first incoming or outgoing edge alpar@18: of the node @var{n}, respectively. alpar@18: alpar@18: If @var{e} is a @code{SymEdgePoint} then alpar@18: @code{GetFirst} sets @var{e} to be the first incoming if there exists one alpar@18: otherwise the first outgoing edge. alpar@18: alpar@18: If there are no such edges, @var{e} will be invalid. alpar@18: alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun InEdgePoint Graph::Next (const InEdgePoint @var{e}) alpar@18: @deftypefunx OutEdgePoint Graph::Next (const OutEdgePoint @var{e}) alpar@18: @deftypefunx SymEdgePoint Graph::Next (const SymEdgePoint @var{e}) alpar@18: These functions give back the edge that follows @var{e} alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun {InEdgePoint &} Graph::GoNext (InEdgePoint &@var{e}) alpar@18: @deftypefunx {OutEdgePoint &} Graph::GoNext (OutEdgePoint &@var{e}) alpar@18: @deftypefunx {SymEdgePoint &} Graph::GoNext (SymEdgePoint &@var{e}) alpar@18: @code{G.GoNext(e)} is equivalent to @code{e=G.Next(e)}, though it alpar@18: might be faster. alpar@18: ??? What should be the return value ??? alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun bool Graph::Valid (EdgePoint &@var{e}) alpar@18: @deftypefunx bool EdgePoint::Valid () alpar@18: These functions check if and EdgePoint is valid or not. alpar@18: ??? Which one should be implemented ??? alpar@18: @end deftypefun alpar@18: alpar@18: @deftypefun NodePoint Graph::From (const EdgePoint @var{e}) alpar@18: @deftypefunx NodePoint Graph::To (const EdgePoint @var{e}) alpar@18: @deftypefunx NodePoint Graph::ANode (const InEdgePoint @var{e}) alpar@18: @deftypefunx NodePoint Graph::ANode (const OutEdgePoint @var{e}) alpar@18: @deftypefunx NodePoint Graph::ANode (const SymEdgePoint @var{e}) alpar@18: @deftypefunx NodePoint Graph::BNode (const InEdgePoint @var{e}) alpar@18: @deftypefunx NodePoint Graph::BNode (const OutEdgePoint @var{e}) alpar@18: @deftypefunx NodePoint Graph::BNode (const SymEdgePoint @var{e}) alpar@18: There queries give back the two endpoints of the edge @var{e}. For a alpar@18: directed edge @var{e}, @code{From(e)} and @code{To(e)} is its tail and alpar@18: its head, respectively. For an undirected @var{e}, they are two alpar@18: endpoints, but you should not rely on which end is which. alpar@18: alpar@18: @code{ANode(e)} is the node which @var{e} is bounded to, i.e. it is alpar@18: equal to @code{From(e)} if @var{e} is an @code{OutEdgePoint} and alpar@18: @code{To(e)} if @var{e} is an @code{InEdgePoint}. If @var{e} is a alpar@18: @code{SymEdgePoint} and it or its first preceding edge was created by alpar@18: @code{GetFirst(e,n)}, then @code{ANode(e)} is equal to @var{n}. alpar@18: alpar@18: @code{BNode(e)} is the other end of the edge. alpar@18: alpar@18: ???It it implemented in an other way now. (Member function <-> Graph global)??? alpar@18: @end deftypefun alpar@18: alpar@18: alpar@18: alpar@18: @c @deftypevar int from alpar@18: @c the tail of the created edge. alpar@18: @c @end deftypevar