【问题标题】:How to implement a multi-source shortest path on unweighted graph using BFS?如何使用 BFS 在未加权图上实现多源最短路径?
【发布时间】:2013-10-23 15:11:29
【问题描述】:

我有一个这样的网格:

000000000
0AAA00000
0AA000000
0AAA00000
000000000
000000000
000000B00
00000BBB0
00000BBBB

现在如何使用 BFS 找到从 A 到 B 的最短路径?在 A 和 A 之间旅行的成本是 0,而 A-0 或 0-B 或 0-0 是一。 我已经尝试在每个 A 上单独应用 BFS 并取其最小值。但这似乎不起作用。还有其他方法吗?

【问题讨论】:

  • 你可以从任何A开始,对吧?
  • 到目前为止你做了什么?
  • 尝试从每个“A”开始使用 Dijkstra 算法。如果您在实现算法时遇到问题,请回来。
  • 有没有办法使用 bfs 做到这一点?
  • 是的,最初只是将所有起始节点排队

标签: algorithm shortest-path breadth-first-search


【解决方案1】:

多源 BFS 的工作方式与常规 BFS 完全相同,但不是从单个节点开始,而是将所有源 (A) 放在队列的开头。也就是说,遍历网格以找到所有 A 并在距离 0 处使用所有它们初始化 BFS 队列。然后照常继续 BFS。

这是一个 Python 实现示例:

from collections import deque
from itertools import product

def get_distance():
    grid = [['0', '0', '0', '0', '0', '0', '0', '0', '0'],
            ['0', 'A', 'A', 'A', '0', '0', '0', '0', '0'],
            ['0', 'A', 'A', '0', '0', '0', '0', '0', '0'],
            ['0', 'A', 'A', 'A', '0', '0', '0', '0', '0'],
            ['0', '0', '0', '0', '0', '0', '0', '0', '0'],
            ['0', '0', '0', '0', '0', '0', '0', '0', '0'],
            ['0', '0', '0', '0', '0', '0', 'B', '0', '0'],
            ['0', '0', '0', '0', '0', 'B', 'B', 'B', '0'],
            ['0', '0', '0', '0', '0', 'B', 'B', 'B', 'B']]
    R = C = 9  # dimensions of the grid
    queue = deque()
    visited = [[False]*C for _ in range(R)]
    distance = [[None]*C for _ in range(R)]
    for row, col in product(range(R), range(C)):
        if grid[row][col] == 'A':
            queue.append((row, col))
            distance[row][col] = 0
            visited[row][col] = True
    while queue:
        r, c = queue.popleft()
        for row, col in ((r-1, c), (r, c+1), (r+1, c), (r, c-1)):  # all directions
            if 0 <= row < R and 0 <= col < C and not visited[row][col]:
                distance[row][col] = distance[r][c] + 1
                if grid[row][col] == 'B':
                    return distance[row][col]
                visited[row][col] = True
                queue.append((row, col))    

print(get_distance())  # 6

【讨论】:

    【解决方案2】:

    BFS 会好的。首先,您通过网格中 A 的所有位置来初始化队列。并且每次在队列的最前面弹出一个位置,同时将1步可以到达但尚未访问的所有位置推入。第一次访问 B 时,您会得到从 A 到 B 的最短路径。

    【讨论】:

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