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实现此操作?是的,只需首先将所有起始节点排队即可