blob: 559c0927475b774ef59285a94eee4c88398d466d (
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
|
@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
|