使用iGraph的哈密尔顿路径

时间:2014-10-24 23:06:04

标签: igraph

我开始评估igraph库及其功能。 我需要计算由igraph_de_bruijn()函数生成的图的哈密顿路径。 igraph库中有没有现成的功能?我不想从头开始实现它。 C中的一个例子是完美的。

1 个答案:

答案 0 :(得分:2)

哈密顿路径问题可以作为子图同构问题投射,其中igraph具有多种功能。使用与图形相同数量的顶点构造一维点阵图(“线”),然后使用子同构函数搜索此图案。

以下是使用Mathematica interface的示例。

hamiltonianPath[g_] := 
 Values@First@IGLADGetSubisomorphism[
    GridGraph[{VertexCount[g]}],  (* <- this is just a 1D lattice, like O-O-O-O *)
    g                             (* <- this is the graph we want to match *)
 ]

让我们尝试一个十二面体图:

g = PolyhedronData["Dodecahedron", "SkeletonGraph"]

Mathematica graphics

以下是顶点需要访问的顺序:

path = hamiltonianPath[g]

(* {1, 16, 7, 3, 14, 9, 17, 19, 5, 11, 12, 8, 4, 20, 6, 2, 13, 18, 10, 15} *)

让我们想象一下:

HighlightGraph[g, PathGraph[path], GraphHighlightStyle -> "Thick"]

Mathematica graphics

我仅使用Mathematica进行说明。使用C接口时,该过程相同。

执行此操作from C时,您可以使用igraph_subisomorphic_lad查找单个子同构(请参阅map参数)。使用igraph_ring创建模式(汉密尔顿路径circular=false,汉密尔顿循环circular=true。如果您希望十二面体用于测试用例,则可以使用igraph_famous来获取它。