如何用dfs找到最长的最小跳跃?

时间:2015-04-13 14:50:55

标签: python algorithm depth-first-search

我想在这个问题中找到问题的所有最佳途径

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))

1 个答案:

答案 0 :(得分:0)

这个问题可能需要花费很长时间来解决这个问题,例如,如果你的图形中有一个必须使用的“瓶颈”跳跃,那么如果跳转是所有跳转中最长的,那么你需要打印出所有图表中的可能路径。因此,鉴于此,最好的解决方案可能是首先求解最短可能的最长跳跃的长度,然后取出图表并移除长度大于该值的所有边缘,然后执行DFS跟踪当前路径,打印出使用受限边缘集的所有可能路径。这将为您提供所有最佳路径的集合。