chiark / gitweb /
New centralised loop-finder, using Tarjan's algorithm.
authorSimon Tatham <anakin@pobox.com>
Wed, 24 Feb 2016 18:57:03 +0000 (18:57 +0000)
committerSimon Tatham <anakin@pobox.com>
Wed, 24 Feb 2016 18:57:03 +0000 (18:57 +0000)
commit1add03f7b8a502d4453f53f4ea6930d0e71a6bb0
tree58eb097586956ebd7f31e8d56d6402d99290191e
parent4a0d9ad39b1fc5e42fea6fb595ca480db0727bcd
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.
findloop.c [new file with mode: 0644]
puzzles.h