【问题标题】:How can i find the shortest path from any node to a set A如何找到从任何节点到集合 A 的最短路径
【发布时间】:2019-11-08 16:20:28
【问题描述】:

我有一个无向图“G”和图 G 中的一组节点“A”

我正在努力寻找一种有效的算法,该算法可以找到从图 G 中的任何节点到集合“A”中最近节点的最短路径

我想过这个:有一个到所有节点的最小距离数组,在集合 A 中的每个节点上运行 BFS 算法,在 BFS 完成后,如果找到更短的路径,则更新数组,这个时间复杂度是 O(k(n +m)) - 随着 K 的增长,这很多,有人告诉我有一个更有效的算法可以使用。请注意,我在这个练习中只能使用 BFS 算法

【问题讨论】:

    标签: algorithm data-structures graph shortest-path


    【解决方案1】:

    创建一个额外的节点,它与“A”中的每个节点都有边。从这个额外的节点运行 BFS。 'A'中每个节点到最近节点的距离比到这个额外节点的距离小1。

    【讨论】:

      【解决方案2】:

      如果您从初始队列中 A 的所有节点开始,您真的只需要一次 BFS 算法。

      • 在地图/字典中跟踪已访问的节点及其从 A 到节点的路径
      • 使用A 集合中每个节点a 的元组(a, empty_path) 初始化BFS 队列
      • 当队列中有更多元素时,从队列中弹出下一个节点和路径
      • 如果节点已经在visited 映射中,跳过它
      • 否则,使用给定路径将其添加到visited
      • 使用扩展路径将邻居节点添加到队列中

      Python 示例:

      # 2--0--1
      # |     |
      # 3     4
      graph = {0: [1, 2], 1: [0, 4], 2: [0, 3], 3: [2], 4: [1]}
      A = [2, 0]
      
      import collections
      queue = collections.deque([(a, []) for a in A])
      visited = {}
      while queue:
          cur, path = queue.popleft()
          if cur in visited: continue
          visited[cur] = path
          for node in graph[cur]:
              queue.append((node, [cur] + path))
      print(visited)
      # {2: [], 0: [], 3: [2], 1: [0], 4: [1, 0]}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多