最短路径图 BFS python

Shortest path Graph BFS python

尝试使用 BFS return 图中的最短路径的 int。这个想法是使用一个 q,作为 [node,distance] 追加到 q 中,然后当我们遍历增加距离并跟踪计数时,当我们第一次到达目的地时,这意味着我们找到了最短路径,所以我们 return 那。但是我得到了错误“currNode,distance = q.popleft() ValueError: 没有足够的值来解压(预期 2,得到 1)"

def shortestPath(graph,nodeA,nodeB):
    q = deque((nodeA,0))
    visited = set(nodeA)

    while q:
        currNode,distance = q.popleft()
        if currNode == nodeB:
            return distance
        for neighbor in graph[currNode]:
            if neighbor not in visited:
                visited.add(neighbor)
                q.append([neighbor,distance+1])
            

    return -1

graph_three = {
    'w':['x','v'],
    'x':['w','y'],
    'y':['x','z'],
    'z':['y','v'],
    'v':['z','w']
}

print(shortestPath(graph_three,'w','z'))

双端队列将元素的可迭代作为输入,你给了它一个元组,所以你的双端队列将包含两个元素,而不是预期的两个元素的一个元组。

将第 2 行修改为:

q = deque([(nodeA,0)])

这里还有一个更简洁的 BFS 实现:

def shortestPath(graph, root, target):
    if root == target: return 0
    q = collections.deque(root)
    visited = set(root)
    distance = 0
    while q:
        for _ in range(len(q)):
            node = q.popleft()
            for neighbor in graph[node]:
                if neighbor == target:
                    return distance + 1
                elif neighbor not in visited:
                    visited.add(neighbor)
                    q.append(neighbor)
        distance += 1
    return -1