Search code examples
algorithmlanguage-agnosticgraphisomorphismpolyhedra

Algorithms for polyhedral graph (planar 3-connected graph) isomorphism?


I've put some research in on the topic of graph isomorphism for planar 3-connected graphs, but there are an abundance of algorithms of different restriction, theoretical complexity, and frequency of use and I am having trouble finding one that stands out as:

  • Easy to understand
  • Can be implemented with maximum clarity
  • Good practical performance on small graphs (up to vertices in the dozens)

It's hard to know without understanding the different algorithms myself whether I'm better off with one of the older, more-specialized algorithms for this problem or the newer, more-general ones. Among all possible candidates, which one is/ones are the best fit?


Solution

  • I think Weinberg's algorithm fits the bill.

    • Easy to understand: compute rotation systems for G and H as byproducts of a planarity testing algorithm. Since G and H are 3-connected, these rotation systems are isomorphic up to interchanging clockwise and counterclockwise if and only if G and H are isomorphic. Choose a dart (= edge with an indicated direction) d in G and try mapping it to all darts e in H (and repeat for the other orientation of H). Since G is connected, all other darts d' can be reached from d by composing the two operations of the rotation system for G. Apply the corresponding operations to e and check whether there is isomorphism.

    • Maximum clarity: aside from the planarity test, the above is a page of code. Maybe you could reuse someone else's planarity test? There's one in Boost, for example. If not, I still think implementing your own is easier than rewriting nauty.

    • Good practical performance on small graphs: after planarity testing, Weinberg's algorithm is basically two synchronized depth-first traversals for each dart. The total running time is O(|V|2) with no large constants lurking.