【发布时间】:2017-11-12 20:31:31
【问题描述】:
给定一个有向图,什么是只访问图的每个顶点一次的算法。这与哈密顿循环不同,我不需要路径在同一个顶点开始和结束。
回溯算法 想到的一种算法是回溯,它使用递归实现,在每一步中,您都会探索所有可能的连接/路径,并保留一个布尔访问数组,以确保不会多次访问任何顶点。向后回溯时,此布尔值将设置为 false(回溯中的基本步骤)。基本情况是比较访问的顶点数,并查看它与图中的节点数匹配,在这种情况下,它将返回 true。如果尚未访问所有顶点,但不存在其他连接以继续递归,则另一个基本情况是返回 false。
但是,这样做的时间复杂度将是O(n!),这是不可取的。
是否有更好的算法来找到有向图的路径/遍历,它恰好覆盖图中的每个顶点一次。
【问题讨论】:
-
不确定这是否有效,但查看强连接组件 (en.wikipedia.org/wiki/Strongly_connected_component) 和图形的浓缩可能有助于减少运行时间。但我的感觉是,在最坏的情况下,你不会比 O(n!) 好。
-
如果你有一个有效的算法来解决这个问题,你也可以有效地解决哈密顿循环(其中“有效”的意思是“在多项式时间内”):对于任何给定的哈密顿循环实例,创建 n 个实例通过删除单个顶点来解决哈密顿路径问题。使用您的有效算法 n 次(每个实例一次)在每个实例中找到一个 HP(如果存在)。如果在这 n 个图中的任何一个中都有一个 HP,并且可以通过添加在该图中删除的特定顶点来将其转换为 HC,那么您已经找到了一个 HC——如果没有,则可以不是任何 HC。
-
@Henry ,据我了解,强连接组件是指组件中的每个顶点都可以从同一组件中的另一个顶点到达的组件。尽管有诸如 Tarjan 之类的有效算法,但我觉得我的问题有点不同。我正在寻找只到达所有顶点。你是否还认为有比n更好的解决方案!解决这个问题?
-
@j_random_hacker,这是一个很好的矛盾证明。是否会以递归方式删除一个顶点,直到我们得到一个只有一个节点的图,它既是哈密顿路径又是哈密顿循环。
-
如果有多个强连接组件,假设有组件 A 和 B,并且您可以从 A 到达 B 但不能从 B 到达 A,那么 A 中的所有节点都必须位于 A 中的节点之前B 在访问所有节点的路径中。这大大减少了排列的数量。
标签: algorithm graph traveling-salesman hamiltonian-cycle