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

Algorithm 如何使用BFS在无权图上实现多源最短路径?,algorithm,shortest-path,breadth-first-search,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,并取最小值。但这似乎不起作用。还有别的办法吗 BFS会没事的。首先,通过网格中A的所有位置初始化队列。每次,你都会在队列的最前面弹出一个位置,同时,按下所有通过一

我有一个这样的网格:

000000000
0AAA00000
0AA000000
0AAA00000
000000000
000000000
000000B00
00000BBB0
00000BBBB
现在如何使用BFS找到从A到B的最短路径?在A和A之间旅行的成本是0,而A-0或0-B或0-0是1。
我试着在每个A上单独应用BFS,并取最小值。但这似乎不起作用。还有别的办法吗

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

多个源的工作方式与常规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
从集合导入数据
来自itertools进口产品
def get_距离():
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#网格尺寸
queue=deque()
已访问=[[False]*C表示范围内(R)]
距离=[[None]*C表示范围内(R)]
对于行,产品中的列(范围(R),范围(C)):
如果网格[行][col]=“A”:
queue.append((行,列))
距离[行][列]=0
已访问[行][列]=真
排队时:
r、 c=queue.popleft()
对于行,列in((r-1,c)、(r,c+1)、(r+1,c)、(r,c-1)):#所有方向

如果0,您可以从任何
A
开始,对吗?到目前为止您做了什么?尝试从每个“A”开始使用Dijkstra算法。如果您在实现该算法时遇到问题,请返回。是否有任何方法可以使用bfs实现此操作?是的,只需首先将所有起始节点排队即可