doc/graphs.dox
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1631 e15162d8eca1
child 2111 ea1fa1bc3f6d
permissions -rw-r--r--
The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.

The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.

The ResGraphAdaptor is based on this composition.
ladanyi@666
     1
/*!
ladanyi@666
     2
ladanyi@1638
     3
\page graphs Graphs
ladanyi@666
     4
alpar@921
     5
The primary data structures of LEMON are the graph classes. They all
alpar@756
     6
provide a node list - edge list interface, i.e. they have
alpar@756
     7
functionalities to list the nodes and the edges of the graph as well
athos@1168
     8
as  incoming and outgoing edges of a given node. 
alpar@756
     9
alpar@756
    10
alpar@873
    11
Each graph should meet the
klao@959
    12
\ref lemon::concept::StaticGraph "StaticGraph" concept.
alpar@873
    13
This concept does not
athos@1168
    14
make it possible to change the graph (i.e. it is not possible to add
alpar@756
    15
or delete edges or nodes). Most of the graph algorithms will run on
alpar@756
    16
these graphs.
alpar@756
    17
alpar@873
    18
The graphs meeting the
klao@959
    19
\ref lemon::concept::ExtendableGraph "ExtendableGraph"
alpar@873
    20
concept allow node and
athos@1168
    21
edge addition. You can also "clear" such a graph (i.e. erase all edges and nodes ).
alpar@756
    22
alpar@873
    23
In case of graphs meeting the full feature
klao@959
    24
\ref lemon::concept::ErasableGraph "ErasableGraph"
alpar@873
    25
concept
athos@1168
    26
you can also erase individual edges and nodes in arbitrary order.
alpar@756
    27
alpar@756
    28
The implemented graph structures are the following.
alpar@921
    29
\li \ref lemon::ListGraph "ListGraph" is the most versatile graph class. It meets
klao@959
    30
the \ref lemon::concept::ErasableGraph "ErasableGraph" concept
athos@1168
    31
and it also has some convenient extra features.
alpar@921
    32
\li \ref lemon::SmartGraph "SmartGraph" is a more memory
alpar@921
    33
efficient version of \ref lemon::ListGraph "ListGraph". The
athos@1168
    34
price of this is that it only meets the
klao@959
    35
\ref lemon::concept::ExtendableGraph "ExtendableGraph" concept,
alpar@756
    36
so you cannot delete individual edges or nodes.
alpar@921
    37
\li \ref lemon::FullGraph "FullGraph"
alpar@1200
    38
implements a complete graph. It is a
alpar@1200
    39
\ref lemon::concept::StaticGraph "StaticGraph", so you cannot
alpar@756
    40
change the number of nodes once it is constructed. It is extremely memory
alpar@756
    41
efficient: it uses constant amount of memory independently from the number of
alpar@1043
    42
the nodes of the graph. Of course, the size of the \ref maps-page "NodeMap"'s and
alpar@1043
    43
\ref maps-page "EdgeMap"'s will depend on the number of nodes.
alpar@756
    44
alpar@921
    45
\li \ref lemon::NodeSet "NodeSet" implements a graph with no edges. This class
alpar@921
    46
can be used as a base class of \ref lemon::EdgeSet "EdgeSet".
alpar@921
    47
\li \ref lemon::EdgeSet "EdgeSet" can be used to create a new graph on
alpar@873
    48
the node set of another graph. The base graph can be an arbitrary graph and it
alpar@921
    49
is possible to attach several \ref lemon::EdgeSet "EdgeSet"'s to a base graph.
alpar@756
    50
alpar@756
    51
\todo Don't we need SmartNodeSet and SmartEdgeSet?
alpar@756
    52
\todo Some cross-refs are wrong.
alpar@756
    53
athos@1168
    54
The graph structures themselves can not store data attached
alpar@756
    55
to the edges and nodes. However they all provide
alpar@1043
    56
\ref maps-page "map classes"
alpar@756
    57
to dynamically attach data the to graph components.
alpar@756
    58
alpar@921
    59
The following program demonstrates the basic features of LEMON's graph
ladanyi@666
    60
structures.
ladanyi@666
    61
ladanyi@666
    62
\code
ladanyi@666
    63
#include <iostream>
alpar@921
    64
#include <lemon/list_graph.h>
ladanyi@666
    65
alpar@921
    66
using namespace lemon;
ladanyi@666
    67
ladanyi@666
    68
int main()
ladanyi@666
    69
{
ladanyi@666
    70
  typedef ListGraph Graph;
ladanyi@666
    71
\endcode
ladanyi@666
    72
alpar@921
    73
ListGraph is one of LEMON's graph classes. It is based on linked lists,
ladanyi@666
    74
therefore iterating throuh its edges and nodes is fast.
ladanyi@666
    75
ladanyi@666
    76
\code
ladanyi@666
    77
  typedef Graph::Edge Edge;
ladanyi@666
    78
  typedef Graph::InEdgeIt InEdgeIt;
ladanyi@666
    79
  typedef Graph::OutEdgeIt OutEdgeIt;
ladanyi@666
    80
  typedef Graph::EdgeIt EdgeIt;
ladanyi@666
    81
  typedef Graph::Node Node;
ladanyi@666
    82
  typedef Graph::NodeIt NodeIt;
ladanyi@666
    83
ladanyi@666
    84
  Graph g;
ladanyi@666
    85
  
ladanyi@666
    86
  for (int i = 0; i < 3; i++)
ladanyi@666
    87
    g.addNode();
ladanyi@666
    88
  
ladanyi@875
    89
  for (NodeIt i(g); i!=INVALID; ++i)
ladanyi@875
    90
    for (NodeIt j(g); j!=INVALID; ++j)
ladanyi@666
    91
      if (i != j) g.addEdge(i, j);
ladanyi@666
    92
\endcode
ladanyi@666
    93
athos@1168
    94
After some convenient typedefs we create a graph and add three nodes to it.
athos@1168
    95
Then we add edges to it to form a complete graph.
ladanyi@666
    96
ladanyi@666
    97
\code
ladanyi@666
    98
  std::cout << "Nodes:";
ladanyi@875
    99
  for (NodeIt i(g); i!=INVALID; ++i)
ladanyi@666
   100
    std::cout << " " << g.id(i);
ladanyi@666
   101
  std::cout << std::endl;
ladanyi@666
   102
\endcode
ladanyi@666
   103
ladanyi@666
   104
Here we iterate through all nodes of the graph. We use a constructor of the
ladanyi@875
   105
node iterator to initialize it to the first node. The operator++ is used to
ladanyi@875
   106
step to the next node. Using operator++ on the iterator pointing to the last
ladanyi@875
   107
node invalidates the iterator i.e. sets its value to
alpar@921
   108
\ref lemon::INVALID "INVALID". This is what we exploit in the stop condition.
ladanyi@666
   109
ladanyi@875
   110
The previous code fragment prints out the following:
ladanyi@666
   111
ladanyi@666
   112
\code
ladanyi@666
   113
Nodes: 2 1 0
ladanyi@666
   114
\endcode
ladanyi@666
   115
ladanyi@666
   116
\code
ladanyi@666
   117
  std::cout << "Edges:";
ladanyi@875
   118
  for (EdgeIt i(g); i!=INVALID; ++i)
alpar@986
   119
    std::cout << " (" << g.id(g.source(i)) << "," << g.id(g.target(i)) << ")";
ladanyi@666
   120
  std::cout << std::endl;
ladanyi@666
   121
\endcode
ladanyi@666
   122
ladanyi@666
   123
\code
ladanyi@666
   124
Edges: (0,2) (1,2) (0,1) (2,1) (1,0) (2,0)
ladanyi@666
   125
\endcode
ladanyi@666
   126
athos@1168
   127
We can also iterate through all edges of the graph very similarly. The 
athos@1168
   128
\c target and
athos@1168
   129
\c source member functions can be used to access the endpoints of an edge.
ladanyi@666
   130
ladanyi@666
   131
\code
ladanyi@666
   132
  NodeIt first_node(g);
ladanyi@666
   133
ladanyi@666
   134
  std::cout << "Out-edges of node " << g.id(first_node) << ":";
ladanyi@875
   135
  for (OutEdgeIt i(g, first_node); i!=INVALID; ++i)
alpar@986
   136
    std::cout << " (" << g.id(g.source(i)) << "," << g.id(g.target(i)) << ")"; 
ladanyi@666
   137
  std::cout << std::endl;
ladanyi@666
   138
ladanyi@666
   139
  std::cout << "In-edges of node " << g.id(first_node) << ":";
ladanyi@875
   140
  for (InEdgeIt i(g, first_node); i!=INVALID; ++i)
alpar@986
   141
    std::cout << " (" << g.id(g.source(i)) << "," << g.id(g.target(i)) << ")"; 
ladanyi@666
   142
  std::cout << std::endl;
ladanyi@666
   143
\endcode
ladanyi@666
   144
ladanyi@666
   145
\code
ladanyi@666
   146
Out-edges of node 2: (2,0) (2,1)
ladanyi@666
   147
In-edges of node 2: (0,2) (1,2)
ladanyi@666
   148
\endcode
ladanyi@666
   149
ladanyi@666
   150
We can also iterate through the in and out-edges of a node. In the above
ladanyi@666
   151
example we print out the in and out-edges of the first node of the graph.
ladanyi@666
   152
ladanyi@666
   153
\code
ladanyi@666
   154
  Graph::EdgeMap<int> m(g);
ladanyi@666
   155
ladanyi@875
   156
  for (EdgeIt e(g); e!=INVALID; ++e)
ladanyi@666
   157
    m.set(e, 10 - g.id(e));
ladanyi@666
   158
  
ladanyi@666
   159
  std::cout << "Id Edge  Value" << std::endl;
ladanyi@875
   160
  for (EdgeIt e(g); e!=INVALID; ++e)
alpar@986
   161
    std::cout << g.id(e) << "  (" << g.id(g.source(e)) << "," << g.id(g.target(e))
ladanyi@666
   162
      << ") " << m[e] << std::endl;
ladanyi@666
   163
\endcode
ladanyi@666
   164
ladanyi@666
   165
\code
ladanyi@666
   166
Id Edge  Value
ladanyi@666
   167
4  (0,2) 6
ladanyi@666
   168
2  (1,2) 8
ladanyi@666
   169
5  (0,1) 5
ladanyi@666
   170
0  (2,1) 10
ladanyi@666
   171
3  (1,0) 7
ladanyi@666
   172
1  (2,0) 9
ladanyi@666
   173
\endcode
ladanyi@666
   174
alpar@873
   175
As we mentioned above, graphs are not containers rather
alpar@921
   176
incidence structures which are iterable in many ways. LEMON introduces
ladanyi@666
   177
concepts that allow us to attach containers to graphs. These containers are
ladanyi@666
   178
called maps.
ladanyi@666
   179
athos@1168
   180
In the example above we create an EdgeMap which assigns an integer value to all
ladanyi@666
   181
edges of the graph. We use the set member function of the map to write values
ladanyi@666
   182
into the map and the operator[] to retrieve them.
ladanyi@666
   183
ladanyi@666
   184
Here we used the maps provided by the ListGraph class, but you can also write
alpar@1043
   185
your own maps. You can read more about using maps \ref maps-page "here".
ladanyi@666
   186
ladanyi@666
   187
*/