dfb8541218
- split input graph into scc and only analyze non-degenerate components - remove least vertex from input graph instead of retrieving subgraphs - directly retrieve scc graph from scc calculation |
||
---|---|---|
_tags | ||
cycles_functional.ml | ||
cycles_iter.ml | ||
Makefile | ||
README.md |
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
./cycles_{iter,functional}.native 4 0,1 0,2 1,0 1,3 2,0 3,0 3,1 3,2
First argument is the number of vertices. Subsequent arguments are ordered pairs of comma separated vertices that make up the directed edges of the graph.
DOT file input
For simplicity, there is no DOT file parser included but the following allows to create a suitable argument string for simple DOT graphs.
Given a DOT file of a simple (no labels, colors, styles, only pairs of vertices...) directed graph, the following line produces commandline arguments in the above format for that graph.
echo `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`
The above line works on DOT files like the following:
digraph G {
0;
1;
2;
0 -> 1;
0 -> 2;
1 -> 0;
2 -> 0;
2 -> 1;
}
It would produce the following output:
3 0,1 0,2 1,0 2,0 2,1