将n作为节点数和边数作为边列表
任何人都可以告诉我我的代码有什么问题。它适用于某些情况但不适用于所有情况
for edgeindex in range(len(edges)):
alltrue = [True]*(n)
visited = [False]*(n)
S = []
start = edges[edgeindex][1]
visited[start] = True
S.append(start)
nex = start
for edgeindex2 in edges[edgeindex:]:
if edgeindex2[0] != nex:
continue
if visited[edgeindex2[1]] == False:
visited[edgeindex2[1]] = True
S.append(edgeindex2[1])
nex = edgeindex2[1]
if visited == alltrue:
return 'yes'
return 'no'
答案 0 :(得分:1)
您的代码是一种贪婪的方法,并添加它可以传递到您的路径的下一个边缘。然而,这种贪婪的方法不适用于哈密顿路径问题(NP-Complete,因此没有已知的'有效'解决方案......)
示例失败:
G = (V,E), V = {1,2,3}, E = {(1,3),(1,2),(2,3)}
现在,假设您从1开始,先行至(1,3)。此时你已经完成了,你找不到汉密尔顿路径。但是,存在路径1-> 2-> 3,您将找不到它。
<强>解决方案:强>
解决哈密尔顿路径的最简单方法是生成所有可能的permutations,并检查它们中是否有任何形成汉密尔顿路径。有更高效(和复杂)的解决方案 - 但它们也需要指数运行时间。