Проблема в вашем коде состоит в том, что ваша очередь не учитывает расстояние до начала координат, чтобы расставить приоритеты для следующей вершины, в которой она появится.
Кроме того, collections.deque
не является приоритетной очередью, и, следовательно, не даст вам ближайшую невидимую вершину, которую вы видели до сих пор, когда извлекаете из нее элемент.
Это следует сделать, используя heapq
, встроенную реализацию кучи:
import heapq
def bfs_short(graph, source, target):
visited = set()
queue = [(0, source)]
heapq.heapify(queue)
while not queue:
dist, vertex = heapq.heappop(queue)
if vertex == target:
return dist
if vertex not in visited:
visited.add(vertex)
for neighbor in graph[vertex]:
if neighbor not in visited:
heapq.heappush(queue, (dist + 1, neighbor))
В этой версии пары помещаются в очередь. Чтобы оценить и сравнить кортежи, Python пытается сравнить их первый элемент, затем второй в случае равенства и так далее.
Таким образом, нажав dist(vertex, origin)
в качестве первого члена кортежа, наименьшая пара (dist, vertex)
в куче также будет ближайшей к исходной вершине.