Поиск в ширину на невзвешенном двунаправленном графике

1

Я пытался использовать 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

Теперь мне может понадобиться дополнительный массив для хранения кратчайшего пути, но я не уверен, как это сделать. Огромное спасибо.

Теги:
python-3.x
data-structures
graph
breadth-first-search

1 ответ

0

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), когда:

  • V = {a, b, c, d, e, f}, | V | = N = 6
  • E = {(a, b), (a, c), (a, e), (b, d), (b, e), (d, f)}, | E | = M = 6

Если мы запустим этот код на нашем графике, мы получим следующий результат:

dist=1: a->b, a->c, a->e
dist=2: a->d
dist=3: a->f

Ещё вопросы

Сообщество Overcoder
Наверх
Меню