【发布时间】:2014-12-20 20:37:06
【问题描述】:
我开始评估 igraph 库及其功能。 我需要计算 igraph_de_bruijn() 函数生成的图的哈密顿路径。 igraph 库中是否有任何现成的功能?我不想从头开始实现它。 C 中的示例将是完美的。
【问题讨论】:
标签: igraph
我开始评估 igraph 库及其功能。 我需要计算 igraph_de_bruijn() 函数生成的图的哈密顿路径。 igraph 库中是否有任何现成的功能?我不想从头开始实现它。 C 中的示例将是完美的。
【问题讨论】:
标签: igraph
哈密顿路径问题可以转换为子图同构问题,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"]
这是需要访问顶点的顺序:
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 只是为了说明。使用C接口时,过程相同。
当您这样做from C 时,您可以使用igraph_subisomorphic_lad 来查找单个 子同构(参见map 参数)。使用igraph_ring 创建模式(circular=false 用于哈密顿路径,circular=true 用于哈密顿循环)。如果您需要十二面体作为测试用例,可以通过igraph_famous 获取。
【讨论】: