doc/quicktour.dox
author athos
Fri, 24 Jun 2005 08:44:54 +0000
changeset 1511 d6b95a59da26
parent 1287 984723507b86
child 1514 c9b9bc63db4e
permissions -rw-r--r--
Half-done, but I want to continue from home.
athos@1169
     1
/**
athos@1169
     2
alpar@1170
     3
\page quicktour Quick Tour to LEMON
alpar@1170
     4
athos@1175
     5
Let us first answer the question <b>"What do I want to use LEMON for?"
athos@1175
     6
</b>. 
athos@1175
     7
LEMON is a C++ library, so you can use it if you want to write C++ 
athos@1175
     8
programs. What kind of tasks does the library LEMON help to solve? 
athos@1175
     9
It helps to write programs that solve optimization problems that arise
athos@1175
    10
frequently when <b>designing and testing certain networks</b>, for example
athos@1175
    11
in telecommunication, computer networks, and other areas that I cannot
athos@1175
    12
think of now. A very natural way of modelling these networks is by means
athos@1183
    13
of a <b> graph</b> (we will always mean a directed graph by that and say
athos@1183
    14
<b> undirected graph </b> otherwise). 
athos@1175
    15
So if you want to write a program that works with 
athos@1183
    16
graphs then you might find it useful to use our library LEMON. LEMON 
athos@1183
    17
defines various graph concepts depending on what you want to do with the 
athos@1183
    18
graph: a very good description can be found in the page
athos@1183
    19
about \ref graphs "graphs".
athos@1175
    20
athos@1511
    21
You will also want to assign data to the edges or nodes of the graph, for example a length or capacity function defined on the edges. You can do this in LEMON using so called \ref maps "maps". You can define a map on the nodes or on the edges of the graph and the value of the map (the range of the function) can be practically almost of any type. Read more about maps \ref maps-page "here".
athos@1175
    22
athos@1511
    23
Some examples are the following (you will find links next to the code fragments that help to download full demo programs: save them on your computer and compile them according to the description in the page about \ref getsart How to start using LEMON):
athos@1175
    24
athos@1175
    25
- First we give two examples that show how to instantiate a graph. The
athos@1175
    26
first one shows the methods that add nodes and edges, but one will
athos@1175
    27
usually use the second way which reads a graph from a stream (file).
athos@1511
    28
-# The following code fragment shows how to fill a graph with data. It creates a complete graph on 4 nodes. The type Listgraph is one of the LEMON graph types: the typedefs in the beginning are for convenience and we will suppose them later as well.
athos@1175
    29
 \code
athos@1175
    30
  typedef ListGraph Graph;
athos@1175
    31
  typedef Graph::NodeIt NodeIt;
athos@1175
    32
athos@1175
    33
  Graph g;
athos@1175
    34
  
athos@1175
    35
  for (int i = 0; i < 3; i++)
athos@1175
    36
    g.addNode();
athos@1175
    37
  
athos@1175
    38
  for (NodeIt i(g); i!=INVALID; ++i)
athos@1175
    39
    for (NodeIt j(g); j!=INVALID; ++j)
athos@1175
    40
      if (i != j) g.addEdge(i, j);
athos@1175
    41
 \endcode 
athos@1175
    42
athos@1511
    43
See the whole program in file \ref helloworld.cc.
athos@1511
    44
athos@1181
    45
If you want to read more on the LEMON graph structures and concepts, read the page about \ref graphs "graphs". 
athos@1181
    46
athos@1181
    47
-# The following code shows how to read a graph from a stream (e.g. a file). LEMON supports the DIMACS file format: it can read a graph instance from a file 
athos@1511
    48
in that format (find the documentation of the DIMACS file format on the web). 
athos@1181
    49
\code
athos@1181
    50
Graph g;
athos@1181
    51
std::ifstream f("graph.dim");
athos@1181
    52
readDimacs(f, g);
athos@1181
    53
\endcode
athos@1183
    54
One can also store network (graph+capacity on the edges) instances and other things in DIMACS format and use these in LEMON: to see the details read the documentation of the \ref dimacs.h "Dimacs file format reader".
athos@1181
    55
athos@1175
    56
athos@1175
    57
- If you want to solve some transportation problems in a network then 
athos@1175
    58
you will want to find shortest paths between nodes of a graph. This is 
athos@1175
    59
usually solved using Dijkstra's algorithm. A utility
athos@1175
    60
that solves this is  the \ref lemon::Dijkstra "LEMON Dijkstra class".
athos@1183
    61
The following code is a simple program using the \ref lemon::Dijkstra "LEMON
athos@1183
    62
Dijkstra class" and it also shows how to define a map on the edges (the length
athos@1183
    63
function):
athos@1175
    64
athos@1175
    65
\code
athos@1183
    66
athos@1183
    67
    typedef ListGraph Graph;
athos@1183
    68
    typedef Graph::Node Node;
athos@1183
    69
    typedef Graph::Edge Edge;
athos@1183
    70
    typedef Graph::EdgeMap<int> LengthMap;
athos@1183
    71
athos@1183
    72
    Graph g;
athos@1183
    73
athos@1183
    74
    //An example from Ahuja's book
athos@1183
    75
athos@1183
    76
    Node s=g.addNode();
athos@1183
    77
    Node v2=g.addNode();
athos@1183
    78
    Node v3=g.addNode();
athos@1183
    79
    Node v4=g.addNode();
athos@1183
    80
    Node v5=g.addNode();
athos@1183
    81
    Node t=g.addNode();
athos@1183
    82
athos@1183
    83
    Edge s_v2=g.addEdge(s, v2);
athos@1183
    84
    Edge s_v3=g.addEdge(s, v3);
athos@1183
    85
    Edge v2_v4=g.addEdge(v2, v4);
athos@1183
    86
    Edge v2_v5=g.addEdge(v2, v5);
athos@1183
    87
    Edge v3_v5=g.addEdge(v3, v5);
athos@1183
    88
    Edge v4_t=g.addEdge(v4, t);
athos@1183
    89
    Edge v5_t=g.addEdge(v5, t);
athos@1183
    90
  
athos@1183
    91
    LengthMap len(g);
athos@1183
    92
athos@1183
    93
    len.set(s_v2, 10);
athos@1183
    94
    len.set(s_v3, 10);
athos@1183
    95
    len.set(v2_v4, 5);
athos@1183
    96
    len.set(v2_v5, 8);
athos@1183
    97
    len.set(v3_v5, 5);
athos@1183
    98
    len.set(v4_t, 8);
athos@1183
    99
    len.set(v5_t, 8);
athos@1183
   100
athos@1511
   101
    std::cout << "The id of s is " << g.id(s)<< std::endl;
athos@1511
   102
    std::cout <<"The id of t is " << g.id(t)<<"."<<std::endl;
athos@1183
   103
athos@1183
   104
    std::cout << "Dijkstra algorithm test..." << std::endl;
athos@1183
   105
athos@1183
   106
    Dijkstra<Graph, LengthMap> dijkstra_test(g,len);
athos@1183
   107
    
athos@1183
   108
    dijkstra_test.run(s);
athos@1183
   109
athos@1183
   110
    
athos@1183
   111
    std::cout << "The distance of node t from node s: " << dijkstra_test.dist(t)<<std::endl;
athos@1183
   112
athos@1511
   113
    std::cout << "The shortest path from s to t goes through the following nodes" <<std::endl;
athos@1511
   114
 std::cout << " (the first one is t, the last one is s): "<<std::endl;
athos@1183
   115
athos@1183
   116
    for (Node v=t;v != s; v=dijkstra_test.predNode(v)){
athos@1183
   117
	std::cout << g.id(v) << "<-";
athos@1183
   118
    }
athos@1183
   119
    std::cout << g.id(s) << std::endl;	
athos@1175
   120
\endcode
athos@1175
   121
alpar@1287
   122
See the whole program in \ref dijkstra_demo.cc.
athos@1183
   123
athos@1183
   124
The first part of the code is self-explanatory: we build the graph and set the
athos@1183
   125
length values of the edges. Then we instantiate a member of the Dijkstra class
athos@1183
   126
and run the Dijkstra algorithm from node \c s. After this we read some of the
athos@1183
   127
results. 
athos@1183
   128
You can do much more with the Dijkstra class, for example you can run it step
athos@1183
   129
by step and gain full control of the execution. For a detailed description, see the documentation of the \ref lemon::Dijkstra "LEMON Dijkstra class".
athos@1183
   130
athos@1183
   131
athos@1175
   132
- If you want to design a network and want to minimize the total length
athos@1175
   133
of wires then you might be looking for a <b>minimum spanning tree</b> in
athos@1175
   134
an undirected graph. This can be found using the Kruskal algorithm: the 
athos@1175
   135
class \ref lemon::Kruskal "LEMON Kruskal class" does this job for you.
athos@1175
   136
The following code fragment shows an example:
athos@1175
   137
athos@1511
   138
Ide Zsuzska fog irni!
athos@1511
   139
athos@1511
   140
- 
athos@1511
   141
athos@1175
   142
\code
athos@1175
   143
athos@1175
   144
\endcode
athos@1175
   145
athos@1175
   146
athos@1175
   147
*/