Я пытался использовать BFS для поиска кратчайшего пути между двумя узлами. Я пробовал смотреть учебники и онлайн-чтения, но ни один из них не был достаточно ясен для меня. В настоящий момент я могу пройти только через график, но я не уверен, какие проверки мне нужно найти, чтобы найти минимальный путь между двумя узлами в графе. График невзвешен и двунаправлен. Это мой код для прохождения через все узлы в графе с использованием BFS.
def bredthfirstsearch(start, end, graph):
queue = [start]
visited = [False]*(roads+1) #marks if a node has been visited
visited[start] = True
while len(queue) != 0:
# source node popped and later used to find neighboring nodes
node = queue.pop(0)
for item in graph[node]:
# if the node has not been found previously
if visited[item[0]] == False:
queue.append(item[0]) # it is added to the queue for future checking on its neighbors
visited[item[0]] = True #node then set to true
Теперь мне может понадобиться дополнительный массив для хранения кратчайшего пути, но я не уверен, как это сделать. Огромное спасибо.
BFS поможет вам найти все кратчайшие пути из определенного узла. Если вы хотите использовать BFS для поиска минимального пути между каждой парой узлов в графике, вам нужно будет запускать BFS почти из каждого узла (почти каждый узел, потому что у вас уже есть некоторые расчеты).
Вот как найти расстояние между двумя узлами. Используя BFS на вершине a (произвольная вершина), вы сможете найти все кратчайшие пути (расстояния) к другим вершинам. Чтобы вычислить расстояние, вы захотите иметь "счетчик уровня". Вот псевдокод, который поможет вам это сделать:
q = new Queue()
dist_array = new Array(N) //and Set each value to infinity
distance=0
q.enqueue(a) //a is the selected node
dist_array[a] = 0
while q not empty:
v = q.dequeue()
++distance
for each neighbor x of v:
if distance_array[x] < infinity:
continue
d[x] = distance
q.enqueue(x)
скажем, что ваш график равен G = (V, E), когда:
Если мы запустим этот код на нашем графике, мы получим следующий результат:
dist=1: a->b, a->c, a->e
dist=2: a->d
dist=3: a->f