如何使用BFS在未加权图上实现多源最短路径?

时间:2013-10-23 15:11:30

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

我有这样的网格:

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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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