我已经读过,查找图中是否存在Hamiltonian path的问题是NP-Complete,并且由于Dijkstra's Shortest Path Algorithm在多项式时间中运行,因此无法修改它以找到最短的哈密顿路径。 (这个逻辑有效吗?)
但是,如果在无向图上给出两个节点(比如A和Z)(所有边都有非负成本),并且给出了给定节点至少有一条哈密顿路径(A)和Z)作为终点。鉴于这些规范,现在是否可以修改Dijkstra算法以找到A和Z为端点的最短哈密顿路径? (在多项式时间内)
注意:我只关心从两个节点中找到最短的哈密顿路径。例如,如果有一个包含26个节点的图形(标记为A到Z),那么通过所有点但从A开始到Z结束的最短路径是什么。(我不关心找到其他不同的Hamilton路径端点,只有A和Z)
附加问题:如果答案是“否”但是还有另一种算法可以用来解决这个问题,那么它是什么算法,它的时间复杂度是多少?
(注意:这个问题有“哈密尔顿循环”作为标签,即使我正在寻找汉密尔顿主义路径,因为我没有足够的代表来制作标签“hamiltonian-path”。但是,让我们说A和Z恰好连接一条边,然后通过找到最短的哈密顿循环然后去除连接A和Z的边来找到最短的哈密顿路径。
答案 0 :(得分:1)
但是,如果在无向上给出两个节点(比如A和Z),该怎么办? 图(所有边都有非负成本),并给出了它 给定节点(A和Z)至少有一条哈密顿路径 作为终点。鉴于这些规范,现在是否可能 修改Dijkstra算法以找到最短的哈密顿路径 A和Z作为端点? (在多项式时间内)
您如何建议修改它?这仅在A和Z之间存在单个路径且它访问图表上的所有其他点时才有效。否则,Dijkstra将终止一些只访问某些节点子集的较短路径。如果在A和Z之间存在哈密顿路径,则可以解决最长路径问题,但这也是NP难度。
答案 1 :(得分:1)
不,这是不可能的。你的简化问题仍然是NP难的。旅行推销员的减少:
根据图表(V, E)
,找到一次访问每个v in V
的最短路径。取一个任意顶点v in V
。将v
拆分为两个顶点v_source
和v_sink
。使用您的算法查找从P
到v_source
的最短哈密顿路径v_sink
。 P
是v
开始和结束的最短周期,访问每个v in V
。由于P
是一个循环,因此“起始”顶点是无关紧要的。因此,P
也是旅行商问题的解决方案。
减少显然是多项式时间(实际上是常数),所以你的问题是NP难的。