aboutsummaryrefslogtreecommitdiff
path: root/bridges.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2016-02-24 18:57:03 +0000
committerSimon Tatham <anakin@pobox.com>2016-02-24 18:57:03 +0000
commit1add03f7b8a502d4453f53f4ea6930d0e71a6bb0 (patch)
tree58eb097586956ebd7f31e8d56d6402d99290191e /bridges.c
parent4a0d9ad39b1fc5e42fea6fb595ca480db0727bcd (diff)
downloadpuzzles-1add03f7b8a502d4453f53f4ea6930d0e71a6bb0.zip
puzzles-1add03f7b8a502d4453f53f4ea6930d0e71a6bb0.tar.gz
puzzles-1add03f7b8a502d4453f53f4ea6930d0e71a6bb0.tar.bz2
puzzles-1add03f7b8a502d4453f53f4ea6930d0e71a6bb0.tar.xz
New centralised loop-finder, using Tarjan's algorithm.
In the course of another recent project I had occasion to read up on Tarjan's bridge-finding algorithm. This analyses an arbitrary graph and finds 'bridges', i.e. edges whose removal would increase the number of connected components. This is precisely the dual problem to error-highlighting loops in games like Slant that don't permit them, because an edge is part of some loop if and only if it is not a bridge. Having understood Tarjan's algorithm, it seemed like a good idea to actually implement it for use in these puzzles, because we've got a long and dishonourable history of messing up the loop detection in assorted ways and I thought it would be nice to have an actually reliable approach without any lurking time bombs. (That history is chronicled in a long comment at the bottom of the new source file, if anyone is interested.) So, findloop.c is a new piece of reusable library code. You run it over a graph, which you provide in the form of a vertex count and a callback function to iterate over the neighbours of each vertex, and it fills in a data structure which you can then query to find out whether any given edge is part of a loop in the graph or not.
Diffstat (limited to 'bridges.c')
0 files changed, 0 insertions, 0 deletions