summaryrefslogtreecommitdiffstats
path: root/tsort.txi
blob: 090e6b4d1e732b472402c724659ec5980f99f1bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@code{(require 'topological-sort)} or @code{(require 'tsort)}
@ftindex topological-sort
@ftindex tsort

@noindent
The algorithm is inspired by Cormen, Leiserson and Rivest (1990)
@cite{Introduction to Algorithms}, chapter 23.


@defun tsort dag pred

@defunx topological-sort dag pred
where
@table @var
@item dag
is a list of sublists.  The car of each sublist is a vertex.  The cdr is
the adjacency list of that vertex, i.e. a list of all vertices to which
there exists an edge from the car vertex.
@item pred
is one of @code{eq?}, @code{eqv?}, @code{equal?}, @code{=},
@code{char=?}, @code{char-ci=?}, @code{string=?}, or @code{string-ci=?}.
@end table

Sort the directed acyclic graph @var{dag} so that for every edge from
vertex @var{u} to @var{v}, @var{u} will come before @var{v} in the
resulting list of vertices.

Time complexity: O (|V| + |E|)

Example (from Cormen):
@quotation
Prof. Bumstead topologically sorts his clothing when getting
dressed.  The first argument to @code{tsort} describes which
garments he needs to put on before others.  (For example,
Prof Bumstead needs to put on his shirt before he puts on his
tie or his belt.)  @code{tsort} gives the correct order of dressing:
@end quotation

@example
(require 'tsort)
@ftindex tsort
(tsort '((shirt tie belt)
         (tie jacket)
         (belt jacket)
         (watch)
         (pants shoes belt)
         (undershorts pants shoes)
         (socks shoes))
       eq?)
@result{}
(socks undershorts pants shoes watch shirt belt tie jacket)
@end example
@end defun