2012-07-04 11:21:28 +00:00
|
|
|
Finding all the elementary circuits of a directed graph
|
|
|
|
-------------------------------------------------------
|
|
|
|
|
|
|
|
Algorithm by D. B. Johnson
|
|
|
|
|
|
|
|
Finding all the elementary circuits of a directed graph.
|
|
|
|
D. B. Johnson, SIAM Journal on Computing 4, no. 1, 77-84, 1975.
|
|
|
|
http://dx.doi.org/10.1137/0204007
|
|
|
|
|
|
|
|
Functional and iterative version.
|
|
|
|
|
|
|
|
Additional code available at http://mancoosi.org/~abate/finding-all-elementary-circuits-directed-graph
|
|
|
|
|
|
|
|
Original git repository at http://mancoosi.org/~abate/repos/cycles.git
|
|
|
|
|
|
|
|
The original code was faulty. This version is fixed for the functional as well
|
|
|
|
as the iterative version.
|
|
|
|
|
|
|
|
Usage
|
|
|
|
-----
|
|
|
|
|
|
|
|
make
|
2013-04-11 08:05:41 +00:00
|
|
|
echo "0 1\n0 2\n1 0\n1 3\n2 0\n3 0\n3 1\n3 2" | ./cycles_{iter,functional}.native 4
|
2012-07-04 11:21:28 +00:00
|
|
|
|
2013-04-11 08:05:41 +00:00
|
|
|
First argument is the number of vertices. Ordered pairs of space separated
|
|
|
|
vertices are given via standard input and make up the directed edges of the
|
2012-07-04 11:21:28 +00:00
|
|
|
graph.
|
|
|
|
|
|
|
|
DOT file input
|
|
|
|
--------------
|
|
|
|
|
|
|
|
For simplicity, there is no DOT file parser included but the following allows
|
2013-04-11 08:05:41 +00:00
|
|
|
to create a suitable argument string and standard input for simple DOT graphs.
|
2012-07-04 11:21:28 +00:00
|
|
|
|
|
|
|
Given a DOT file of a simple (no labels, colors, styles, only pairs of
|
2013-04-11 08:05:41 +00:00
|
|
|
vertices...) directed graph, the following lines generate the number of
|
|
|
|
vertices as well as the edge list expected on standard input.
|
2012-07-04 11:21:28 +00:00
|
|
|
|
2013-04-11 08:05:41 +00:00
|
|
|
sed -n -e '/^\s*[0-9]\+;$/p' graph.dot | wc -l
|
|
|
|
sed -n -e 's/^\s*\([0-9]\) -> \([0-9]\);$/\1 \2/p' graph.dot
|
2012-07-04 11:21:28 +00:00
|
|
|
|
2013-04-11 08:25:53 +00:00
|
|
|
The above lines work on DOT files like the following:
|
2012-07-04 11:21:28 +00:00
|
|
|
|
|
|
|
digraph G {
|
|
|
|
0;
|
|
|
|
1;
|
|
|
|
2;
|
|
|
|
0 -> 1;
|
|
|
|
0 -> 2;
|
|
|
|
1 -> 0;
|
|
|
|
2 -> 0;
|
|
|
|
2 -> 1;
|
|
|
|
}
|
|
|
|
|
2013-04-11 08:05:41 +00:00
|
|
|
They would produce the following output:
|
2012-07-04 11:21:28 +00:00
|
|
|
|
2013-04-11 08:05:41 +00:00
|
|
|
3
|
|
|
|
0 1
|
|
|
|
0 2
|
|
|
|
1 0
|
|
|
|
2 0
|
|
|
|
2 1
|