graphs.dox
author Peter Kovacs <kpeter@inf.elte.hu>
Mon, 15 Feb 2010 01:51:58 +0100
changeset 32 ef12f83752f6
parent 28 42b0128ae0a7
child 38 236e7061b70d
permissions -rw-r--r--
Happy New Year + unify files
kpeter@28
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
kpeter@28
     2
 *
kpeter@28
     3
 * This file is a part of LEMON, a generic C++ optimization library.
kpeter@28
     4
 *
kpeter@32
     5
 * Copyright (C) 2003-2010
kpeter@28
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
kpeter@28
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
kpeter@28
     8
 *
kpeter@28
     9
 * Permission to use, modify and distribute this software is granted
kpeter@28
    10
 * provided that this copyright notice appears in all copies. For
kpeter@28
    11
 * precise terms see the accompanying LICENSE file.
kpeter@28
    12
 *
kpeter@28
    13
 * This software is provided "AS IS" with no warranty of any kind,
kpeter@28
    14
 * express or implied, and with no claim as to its suitability for any
kpeter@28
    15
 * purpose.
kpeter@28
    16
 *
kpeter@28
    17
 */
kpeter@28
    18
kpeter@28
    19
namespace lemon {
kpeter@28
    20
/**
kpeter@28
    21
[PAGE]sec_graph_structures[PAGE] Graph Structures
kpeter@28
    22
kpeter@28
    23
The implementation of combinatorial algorithms heavily relies on
kpeter@28
    24
efficient graph structures. Diverse applications require the
kpeter@28
    25
usage of different physical graph storages.
kpeter@28
    26
In \ref sec_basics, we have introduced a general digraph structure,
kpeter@28
    27
\ref ListDigraph. Apart from this class, LEMON provides several
kpeter@28
    28
other classes for handling directed and undirected graphs to meet the
kpeter@28
    29
diverging requirements of the possible users. In order to save on running
kpeter@28
    30
time or on memory usage, some structures may fail to support some graph
kpeter@28
    31
features like node or arc/edge deletion.
kpeter@28
    32
You are free to use the graph structure that fit your requirements the best,
kpeter@28
    33
since most graph algorithms and auxiliary data structures can be used
kpeter@28
    34
with any of them.
kpeter@28
    35
kpeter@28
    36
kpeter@28
    37
[SEC]sec_graph_concepts[SEC] Graph Concepts
kpeter@28
    38
kpeter@28
    39
In LEMON, there are various graph types, which are rather different, but
kpeter@28
    40
they all conform to the corresponding \ref graph_concepts "graph concept",
kpeter@32
    41
which defines the common part of the graph interfaces.
kpeter@28
    42
The \ref concepts::Digraph "Digraph concept" describes the common interface
kpeter@28
    43
of directed graphs (without any sensible implementation), while
kpeter@28
    44
the \ref concepts::Graph "Graph concept" describes the undirected graphs.
kpeter@28
    45
Any generic graph algorithm should only exploit the features of the
kpeter@28
    46
corresponding graph concept. (It should compile with the
kpeter@28
    47
\ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph" type,
kpeter@28
    48
but it will not run properly, of course.)
kpeter@28
    49
kpeter@28
    50
The graph %concepts define the member classes for the iterators and maps
kpeter@28
    51
along with some useful basic functions for obtaining the identifiers of
kpeter@28
    52
the items, the end nodes of the arcs (or edges) and their iterators,
kpeter@32
    53
etc.
kpeter@28
    54
An actual graph implementation may have various additional functionalities
kpeter@28
    55
according to its purpose.
kpeter@28
    56
kpeter@28
    57
kpeter@28
    58
[SEC]sec_digraph_types[SEC] Digraph Structures
kpeter@28
    59
kpeter@28
    60
The already used \ref ListDigraph class is the most versatile directed
kpeter@28
    61
graph structure. Apart from the general digraph functionalities, it
kpeter@28
    62
provides operations for adding and removing nodes and arcs, changing
kpeter@28
    63
the source or target node of an arc, and contracting and splitting nodes
kpeter@28
    64
or arcs.
kpeter@28
    65
kpeter@28
    66
\ref SmartDigraph is another general digraph implementation, which is
kpeter@28
    67
significantly more efficient (both in terms of space and time), but it
kpeter@28
    68
provides less functionality. For example, nodes and arcs cannot be
kpeter@32
    69
removed from it.
kpeter@28
    70
kpeter@28
    71
\ref FullDigraph is an efficient implementation of a directed full graph.
kpeter@28
    72
This structure is completely static, so you can neither add nor delete
kpeter@28
    73
arcs or nodes, and the class needs constant space in memory.
kpeter@28
    74
kpeter@28
    75
kpeter@28
    76
[SEC]sec_undir_graphs[SEC] Undirected Graphs
kpeter@28
    77
kpeter@28
    78
LEMON also provides undirected graph structures. For example,
kpeter@28
    79
\ref ListGraph and \ref SmartGraph are the undirected versions of
kpeter@28
    80
\ref ListDigraph and \ref SmartDigraph, respectively.
kpeter@28
    81
They provide similar features to the digraph structures.
kpeter@28
    82
kpeter@28
    83
The \ref concepts::Graph "undirected graphs" also fulfill the concept of
kpeter@32
    84
\ref concepts::Digraph "directed graphs", in such a way that each
kpeter@28
    85
undirected \e edge of a graph can also be regarded as two oppositely
kpeter@28
    86
directed \e arcs. As a result, all directed graph algorithms automatically
kpeter@28
    87
run on undirected graphs, as well.
kpeter@28
    88
kpeter@28
    89
Undirected graphs provide an \c Edge type for the \e undirected \e edges
kpeter@28
    90
and an \c Arc type for the \e directed \e arcs. The \c Arc type is
kpeter@28
    91
convertible to \c Edge (or inherited from it), thus the corresponding
kpeter@28
    92
edge can always be obtained from an arc.
kpeter@28
    93
kpeter@28
    94
Only nodes and edges can be added to or removed from an undirected
kpeter@28
    95
graph and the corresponding arcs are added or removed automatically
kpeter@28
    96
(there are twice as many arcs as edges)
kpeter@28
    97
kpeter@28
    98
For example,
kpeter@28
    99
\code
kpeter@28
   100
  ListGraph g;
kpeter@32
   101
kpeter@28
   102
  ListGraph::Node a = g.addNode();
kpeter@28
   103
  ListGraph::Node b = g.addNode();
kpeter@28
   104
  ListGraph::Node c = g.addNode();
kpeter@28
   105
kpeter@28
   106
  ListGraph::Edge e = g.addEdge(a,b);
kpeter@28
   107
  g.addEdge(b,c);
kpeter@28
   108
  g.addEdge(c,a);
kpeter@28
   109
\endcode
kpeter@28
   110
kpeter@28
   111
Each edge has an inherent orientation, thus it can be defined whether an
kpeter@28
   112
arc is forward or backward oriented in an undirected graph with respect
kpeter@28
   113
to this default oriantation of the represented edge.
kpeter@28
   114
The direction of an arc can be obtained and set using the functions
kpeter@28
   115
\ref concepts::Graph::direction() "direction()" and
kpeter@28
   116
\ref concepts::Graph::direct() "direct()", respectively.
kpeter@28
   117
kpeter@28
   118
For example,
kpeter@28
   119
\code
kpeter@28
   120
  ListGraph::Arc a1 = g.direct(e, true);    // a1 is the forward arc
kpeter@28
   121
  ListGraph::Arc a2 = g.direct(e, false);   // a2 is the backward arc
kpeter@28
   122
kpeter@28
   123
  if (a2 == g.oppositeArc(a1))
kpeter@28
   124
    std::cout << "a2 is the opposite of a1" << std::endl;
kpeter@28
   125
\endcode
kpeter@28
   126
kpeter@28
   127
The end nodes of an edge can be obtained using the functions
kpeter@28
   128
\ref concepts::Graph::source() "u()" and
kpeter@28
   129
\ref concepts::Graph::target() "v()", while the
kpeter@28
   130
\ref concepts::Graph::source() "source()" and
kpeter@28
   131
\ref concepts::Graph::target() "target()" can be used for arcs.
kpeter@28
   132
kpeter@28
   133
\code
kpeter@28
   134
  std::cout << "Edge " << g.id(e) << " connects node "
kpeter@28
   135
    << g.id(g.u(e)) << " and node " << g.id(g.v(e)) << std::endl;
kpeter@32
   136
kpeter@28
   137
  std::cout << "Arc " << g.id(a2) << " goes from node "
kpeter@28
   138
    << g.id(g.source(a2)) << " to node " << g.id(g.target(a2)) << std::endl;
kpeter@28
   139
\endcode
kpeter@28
   140
kpeter@28
   141
kpeter@28
   142
Similarly to the digraphs, the undirected graphs also provide iterators
kpeter@28
   143
\ref concepts::Graph::NodeIt "NodeIt", \ref concepts::Graph::ArcIt "ArcIt",
kpeter@28
   144
\ref concepts::Graph::OutArcIt "OutArcIt" and \ref concepts::Graph::InArcIt
kpeter@28
   145
"InArcIt", which can be used the same way.
kpeter@28
   146
However, they also have iterator classes for edges.
kpeter@28
   147
\ref concepts::Graph::EdgeIt "EdgeIt" traverses all edges in the graph and
kpeter@28
   148
\ref concepts::Graph::IncEdgeIt "IncEdgeIt" lists the incident edges of a
kpeter@28
   149
certain node.
kpeter@28
   150
kpeter@28
   151
For example, the degree of each node can be computed and stored in a node map
kpeter@28
   152
like this:
kpeter@28
   153
kpeter@28
   154
\code
kpeter@28
   155
  ListGraph::NodeMap<int> deg(g, 0);
kpeter@28
   156
  for (ListGraph::NodeIt n(g); n != INVALID; ++n) {
kpeter@28
   157
    for (ListGraph::IncEdgeIt e(g, n); e != INVALID; ++e) {
kpeter@28
   158
      deg[n]++;
kpeter@28
   159
    }
kpeter@28
   160
  }
kpeter@28
   161
\endcode
kpeter@28
   162
kpeter@28
   163
In an undirected graph, both \ref concepts::Graph::OutArcIt "OutArcIt"
kpeter@28
   164
and \ref concepts::Graph::InArcIt "InArcIt" iterates on the same \e edges
kpeter@28
   165
but with opposite direction. They are convertible to both \c Arc and
kpeter@28
   166
\c Edge types. \ref concepts::Graph::IncEdgeIt "IncEdgeIt" also iterates
kpeter@28
   167
on these edges, but it is not convertible to \c Arc, only to \c Edge.
kpeter@28
   168
kpeter@28
   169
Apart from the node and arc maps, an undirected graph also defines
kpeter@28
   170
a template member class for constructing edge maps. These maps can be
kpeter@28
   171
used in conjunction with both edges and arcs.
kpeter@28
   172
kpeter@28
   173
For example,
kpeter@28
   174
\code
kpeter@28
   175
  ListGraph::EdgeMap cost(g);
kpeter@28
   176
  cost[e] = 10;
kpeter@28
   177
  std::cout << cost[e] << std::endl;
kpeter@28
   178
  std::cout << cost[a1] << ", " << cost[a2] << std::endl;
kpeter@28
   179
kpeter@28
   180
  ListGraph::ArcMap arc_cost(g);
kpeter@28
   181
  arc_cost[a1] = cost[a1];
kpeter@28
   182
  arc_cost[a2] = 2 * cost[a2];
kpeter@28
   183
  // std::cout << arc_cost[e] << std::endl;   // this is not valid
kpeter@28
   184
  std::cout << arc_cost[a1] << ", " << arc_cost[a2] << std::endl;
kpeter@28
   185
\endcode
kpeter@32
   186
kpeter@28
   187
[SEC]sec_special_graphs[SEC] Special Graph Structures
kpeter@28
   188
kpeter@28
   189
In addition to the general undirected classes \ref ListGraph and
kpeter@28
   190
\ref SmartGraph, LEMON also provides special purpose graph types for
kpeter@28
   191
handling \ref FullGraph "full graphs", \ref GridGraph "grid graphs" and
kpeter@28
   192
\ref HypercubeGraph "hypercube graphs".
kpeter@28
   193
They all static structures, i.e. they do not allow distinct item additions
kpeter@28
   194
or deletions, the graph has to be built at once.
kpeter@28
   195
kpeter@28
   196
[TRAILER]
kpeter@28
   197
*/
kpeter@28
   198
}