我想在这个问题中找到问题的所有最佳途径
The frog's longest Smallest Jump
使用非递归深度优先搜索(dfs)。基本上每块石头都是图形的顶点,目标顶点到达对岸。
在伪代码中,它将类似于以下内容(使用dfs的递归实现)
dfs( currentLocation, visited):
if currentLocation is opposite bank:
return (best jump 0, empty path)
for each rock R not in visited set: // treat opposite bank as a rock here
(maxHop, path) = dfs( R, visited + currentLocation )
hop = distance( currentLocation, R)
path = [R] + path
if hop > maxHop then maxHop = hop
# find best hop, path pair over all R
if longest < best_jump:
best_jump = longest
best_path = (i, j, k)
return (best hop, best path)
我无法弄清楚如何调整dfs的以下非递归python实现
def dfs_paths(graph, start, goal):
stack = [(start, [start])]
while stack:
(vertex, path) = stack.pop()
for next in graph[vertex].difference(set(path)):
if next == goal:
yield path + [next]
else:
stack.append((next, path + [next]))
考虑到跳跃长度。此实现中的图形是类似
的字典 graph = {'A': set(['B', 'C']),
'B': set(['A', 'D', 'E']),
'C': set(['A', 'F']),
'D': set(['B']),
'E': set(['B', 'F']),
'F': set(['C', 'E'])}
但是在跳跃问题中我需要用石头和远岸的代表来替换角色。然后我可以通过
获取路径paths=list(dfs_paths(graph, start_goal, end_goal))
答案 0 :(得分:0)
这个问题可能需要花费很长时间来解决这个问题,例如,如果你的图形中有一个必须使用的“瓶颈”跳跃,那么如果跳转是所有跳转中最长的,那么你需要打印出所有图表中的可能路径。因此,鉴于此,最好的解决方案可能是首先求解最短可能的最长跳跃的长度,然后取出图表并移除长度大于该值的所有边缘,然后执行DFS跟踪当前路径,打印出使用受限边缘集的所有可能路径。这将为您提供所有最佳路径的集合。