COIN-OR::LEMON - Graph Library

source: lemon-0.x/doc/graphs.dox @ 2553:bfced05fa852

Last change on this file since 2553:bfced05fa852 was 2553:bfced05fa852, checked in by Alpar Juttner, 16 years ago

Happy New Year to LEMON (+ better update-copyright-header script)

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