doc/basic_concepts.dox
changeset 2279 2c3fee01d3ed
child 2288 ef8af928c54e
equal deleted inserted replaced
-1:000000000000 0:916279fcf452
       
     1 /**
       
     2 \page basic_concepts Basic concepts
       
     3 
       
     4 \section basic_graph The graph classes
       
     5 The most important classes in LEMON are the graph classes. A instance of a graph
       
     6 class is the representation of the mathematical graph. It holds the topology and
       
     7 every structural information of the graph. The structural manipulations are also
       
     8 provided by the graph object. There is no universal graph class instead we have
       
     9 different classes for different purposes. They can differ in many ways, but all
       
    10 have to satisfy one or more \ref concept "graph concepts" which are standardized
       
    11 interfaces to work whit the rest of the library. The most basic concept is the
       
    12 \ref Graph.<br>
       
    13 A good example is the \ref ListGraph which we already know from Hello World and
       
    14 will be used in our examples as well.
       
    15 
       
    16 One main advantage of the templates are, that you can write your own graph classes.
       
    17 As long as they provide the interface a concept is defining all the LEMON algorithms
       
    18 and classes will work with it properly - no representation or implementation is
       
    19 written into stone.
       
    20 
       
    21 
       
    22 \subsection basic_node Nodes
       
    23 To refer to a node of a graph we need some kind of typed variable. Graph classes
       
    24 have the Node public type for this purpose. Stacking by the last example:
       
    25 \code lemon::ListGraph::Node \endcode
       
    26 
       
    27 If the graph fits the ExtendableGraphComponent concept, then you can add new nodes
       
    28 to the graph with the addNode() member function. It returns the newly added node
       
    29 (as value). So if you need the new node to do something useful with it, for example
       
    30 create a edge, assign a value to it through \ref map1 maps.
       
    31 \code lemon::ListGraph::Node  new_node = graph.addNode(); \endcode
       
    32 
       
    33 If the graph fits the ErasableGraphComponent concept you also can remove nodes
       
    34 from the graph with the erase() member function.
       
    35 \code graph.erase( new_node ); \endcode
       
    36 
       
    37 You don't have to store every node in a variable, you can access individual nodes
       
    38 with node iterators discussed in the next section. But how do you know which
       
    39 node is which?<br>
       
    40 The graph class has the id( Node n ) member function providing an unique identifier
       
    41 assigned to every node.
       
    42 
       
    43 
       
    44 \subsection basic_edge Edges
       
    45 An Edge is what you think it is. It goes from one node to another node (they can
       
    46 be identical). If the graph class is directed, the Edge is directed too. Otherwise
       
    47 the edge is considered undirected and called UEdge.
       
    48 \code lemon::ListUGraph::UEdge \endcode
       
    49 
       
    50 The addEdge() member function will create a new edge. It has two arguments, the
       
    51 source node and the target node. The graph class must be extendable.
       
    52 \code lemon::ListGraph::Edge  new_edge = graph.addEdge( src_node, trg_node ); \endcode
       
    53 You can handle edge similar as nodes. The erase() member function has an edge taking
       
    54 overload too.
       
    55 
       
    56 You can ask for the source or target node of the edge by the corresponding member
       
    57 functions:
       
    58 \code
       
    59 graph.source( new_edge );
       
    60 lemon::ListGraph::Node  n = graph.target( new_edge ); \endcode
       
    61 These functions are always legal even if the graph is undirected. UEdge has a
       
    62 default direction.
       
    63 
       
    64 
       
    65 \section basic_iterators Iterators
       
    66 Graphs are some kind of containers. And as you expect they have iterator types.
       
    67 One fore nodes and a couple for edges - and special classes can have additional
       
    68 iterators too. An example:
       
    69 \code lemon::ListGraph::NodeIt \endcode
       
    70 That is a node iterator. Every iterator type starts whit an name what refers to
       
    71 the iterated object, and ends whit 'It'.
       
    72 
       
    73 LEMON style iterators differs from \c stl or \c boost iterators in a very tasty
       
    74 way. A graph has no begin or end - or at least a generic graph class has none.
       
    75 If by some topology you could pick a good begin node, it would be misleading and
       
    76 incorrect. A LEMON style iterator must be initialized at construction time.
       
    77 The constructor takes the needed parameters - by a node iterator it's the graph
       
    78 object. And will be compared to the lemon::INVALID to check if it's still valid.
       
    79 Every iterator can be compared to INVALID. No \c begin() or \c end() needed.<br>
       
    80 Let's see these things working together:
       
    81 \code
       
    82 for( ListGraph::NodeIt n(graph); n != INVALID; ++n )
       
    83     do_useful_things_whit_node(n);
       
    84 \endcode
       
    85 Note that the function \c do_useful_things_with_node() expects a Node type argument
       
    86 ad we just gave him the iterator. LEMON style iterators must provide "on demand
       
    87 dereferencing". For example a NodeIt can be used everywhere a Node could. (In some
       
    88 graph classes Node is the base class of NodeIt. But in other cases this is implemented
       
    89 through typecast operator.)
       
    90 
       
    91 <b>Very important!</b> The iteration has no defined order. There is absolutely no
       
    92 guaranty that the next time the iteration will give us the nodes in the same order.
       
    93 Don't use this order to identify nodes! Use the \c id() member function of the
       
    94 graph class described above. (There is a powerful technique using maps right in
       
    95 the next page.)
       
    96 
       
    97 The \ref EdgeIt works exactly the same - nothing more to say. But there are \ref InEdgeIt
       
    98 and \ref OutEdgeIt by directed graphs and \ref IncEdgeIt by undirected graphs.
       
    99 They take two arguments. The first is a graph, the second is certain node of the
       
   100 graph. InEdgeIt iterates on the incoming edges of that node and OutEdgeIt does it
       
   101 on the outgoing edges. The IncEdgeIt of course iterates every edge connecting to
       
   102 the given node.
       
   103 
       
   104 \code
       
   105 for( ListGraph::NodeIt n(graph); n != INVALID; ++n ) {
       
   106   int in = 0, out = 0;
       
   107   for( ListGraph::InEdgeIt e(graph,n); e != INVALID; ++e ) ++in;
       
   108   for( ListGraph::OutEdgeIt e(graph,n); e != INVALID; ++e ) ++out;
       
   109 
       
   110   std::cout << "#" << graph.id(n) << " node has " << in << " incoming and "
       
   111     << out << "outgoing edges." << std::endl;
       
   112 }
       
   113 \endcode
       
   114 
       
   115 
       
   116 \section basic_ListGraph ListGraph - a versatile directed graph
       
   117 As you see ListGraph satisfies most of the basic concepts and ideal for general
       
   118 graph representations. It has an undirected version too: ListUGraph.
       
   119 */