5 The primary data structures of LEMON are the graph classes. They all
6 provide a node list - edge list interface, i.e. they have
7 functionalities to list the nodes and the edges of the graph as well
8 as incoming and outgoing edges of a given node.
11 Each graph should meet the
12 \ref lemon::concept::StaticGraph "StaticGraph" concept.
14 make it possible to change the graph (i.e. it is not possible to add
15 or delete edges or nodes). Most of the graph algorithms will run on
18 The graphs meeting the
19 \ref lemon::concept::ExtendableGraph "ExtendableGraph"
20 concept allow node and
21 edge addition. You can also "clear" such a graph (i.e. erase all edges and nodes ).
23 In case of graphs meeting the full feature
24 \ref lemon::concept::ErasableGraph "ErasableGraph"
26 you can also erase individual edges and nodes in arbitrary order.
28 The implemented graph structures are the following.
29 \li \ref lemon::ListGraph "ListGraph" is the most versatile graph class. It meets
30 the \ref lemon::concept::ErasableGraph "ErasableGraph" concept
31 and it also has some convenient extra features.
32 \li \ref lemon::SmartGraph "SmartGraph" is a more memory
33 efficient version of \ref lemon::ListGraph "ListGraph". The
34 price of this is that it only meets the
35 \ref lemon::concept::ExtendableGraph "ExtendableGraph" concept,
36 so you cannot delete individual edges or nodes.
37 \li \ref lemon::FullGraph "FullGraph"
38 implements a complete graph. It is a
39 \ref lemon::concept::StaticGraph "StaticGraph", so you cannot
40 change the number of nodes once it is constructed. It is extremely memory
41 efficient: it uses constant amount of memory independently from the number of
42 the nodes of the graph. Of course, the size of the \ref maps-page "NodeMap"'s and
43 \ref maps-page "EdgeMap"'s will depend on the number of nodes.
45 \li \ref lemon::NodeSet "NodeSet" implements a graph with no edges. This class
46 can be used as a base class of \ref lemon::EdgeSet "EdgeSet".
47 \li \ref lemon::EdgeSet "EdgeSet" can be used to create a new graph on
48 the node set of another graph. The base graph can be an arbitrary graph and it
49 is possible to attach several \ref lemon::EdgeSet "EdgeSet"'s to a base graph.
51 \todo Don't we need SmartNodeSet and SmartEdgeSet?
52 \todo Some cross-refs are wrong.
54 The graph structures themselves can not store data attached
55 to the edges and nodes. However they all provide
56 \ref maps-page "map classes"
57 to dynamically attach data the to graph components.
59 The following program demonstrates the basic features of LEMON's graph
64 #include <lemon/list_graph.h>
66 using namespace lemon;
70 typedef ListGraph Graph;
73 ListGraph is one of LEMON's graph classes. It is based on linked lists,
74 therefore iterating throuh its edges and nodes is fast.
77 typedef Graph::Edge Edge;
78 typedef Graph::InEdgeIt InEdgeIt;
79 typedef Graph::OutEdgeIt OutEdgeIt;
80 typedef Graph::EdgeIt EdgeIt;
81 typedef Graph::Node Node;
82 typedef Graph::NodeIt NodeIt;
86 for (int i = 0; i < 3; i++)
89 for (NodeIt i(g); i!=INVALID; ++i)
90 for (NodeIt j(g); j!=INVALID; ++j)
91 if (i != j) g.addEdge(i, j);
94 After some convenient typedefs we create a graph and add three nodes to it.
95 Then we add edges to it to form a complete graph.
98 std::cout << "Nodes:";
99 for (NodeIt i(g); i!=INVALID; ++i)
100 std::cout << " " << g.id(i);
101 std::cout << std::endl;
104 Here we iterate through all nodes of the graph. We use a constructor of the
105 node iterator to initialize it to the first node. The operator++ is used to
106 step to the next node. Using operator++ on the iterator pointing to the last
107 node invalidates the iterator i.e. sets its value to
108 \ref lemon::INVALID "INVALID". This is what we exploit in the stop condition.
110 The previous code fragment prints out the following:
117 std::cout << "Edges:";
118 for (EdgeIt i(g); i!=INVALID; ++i)
119 std::cout << " (" << g.id(g.source(i)) << "," << g.id(g.target(i)) << ")";
120 std::cout << std::endl;
124 Edges: (0,2) (1,2) (0,1) (2,1) (1,0) (2,0)
127 We can also iterate through all edges of the graph very similarly. The
129 \c source member functions can be used to access the endpoints of an edge.
132 NodeIt first_node(g);
134 std::cout << "Out-edges of node " << g.id(first_node) << ":";
135 for (OutEdgeIt i(g, first_node); i!=INVALID; ++i)
136 std::cout << " (" << g.id(g.source(i)) << "," << g.id(g.target(i)) << ")";
137 std::cout << std::endl;
139 std::cout << "In-edges of node " << g.id(first_node) << ":";
140 for (InEdgeIt i(g, first_node); i!=INVALID; ++i)
141 std::cout << " (" << g.id(g.source(i)) << "," << g.id(g.target(i)) << ")";
142 std::cout << std::endl;
146 Out-edges of node 2: (2,0) (2,1)
147 In-edges of node 2: (0,2) (1,2)
150 We can also iterate through the in and out-edges of a node. In the above
151 example we print out the in and out-edges of the first node of the graph.
154 Graph::EdgeMap<int> m(g);
156 for (EdgeIt e(g); e!=INVALID; ++e)
157 m.set(e, 10 - g.id(e));
159 std::cout << "Id Edge Value" << std::endl;
160 for (EdgeIt e(g); e!=INVALID; ++e)
161 std::cout << g.id(e) << " (" << g.id(g.source(e)) << "," << g.id(g.target(e))
162 << ") " << m[e] << std::endl;
175 As we mentioned above, graphs are not containers rather
176 incidence structures which are iterable in many ways. LEMON introduces
177 concepts that allow us to attach containers to graphs. These containers are
180 In the example above we create an EdgeMap which assigns an integer value to all
181 edges of the graph. We use the set member function of the map to write values
182 into the map and the operator[] to retrieve them.
184 Here we used the maps provided by the ListGraph class, but you can also write
185 your own maps. You can read more about using maps \ref maps-page "here".