最短路径广度优先搜索算法介绍

最短路径广度优先搜索(Breadth-First Search, BFS)算法通常不直接用于寻找加权图中的最短路径,因为它在搜索过程中不会考虑边的权重。然而,在无权图中(即所有边的权重都相等),BFS可以用来找到从一个源顶点到所有其他顶点的最短路径。

在无权图中使用BFS寻找最短路径的基本步骤如下:

1、初始化:

创建一个队列Q用于存储待处理的顶点。
创建一个集合visited用于记录已经访问过的顶点,防止重复访问。
创建一个距离数组dist,用于记录从源顶点到各个顶点的最短路径长度(在无权图中,这个长度实际上是跳数或步数)。初始时,除了源顶点外,所有顶点的距离都设为无穷大或某个大数,源顶点的距离设为0。

2、开始搜索:

将源顶点加入队列Q,并将其标记为已访问。
在Q不为空的情况下循环执行以下步骤:
从Q中取出一个顶点u。
遍历顶点u的所有邻接顶点v:
如果顶点v尚未被访问,则将其加入队列Q,标记为已访问,并更新其距离dist[v]为dist[u] + 1(因为是无权图,所以增加1表示多经过了一步)。

3、结果:

搜索完成后,dist数组将包含从源顶点到图中所有可达顶点的最短路径长度(跳数或步数)。

注意:

如果图是有向的,BFS仍然适用,但需要注意方向。
如果图包含权重不同的边,则应使用如Dijkstra算法或Bellman-Ford算法等更适用于加权图的算法来寻找最短路径。

示例代码(Python):

from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0

    while queue:
        vertex = queue.popleft()
        if vertex not in visited:
            visited.add(vertex)
            for neighbour in graph[vertex]:
                if neighbour not in visited:
                    queue.append(neighbour)
                    distances[neighbour] = distances[vertex] + 1

    return distances

# 示例图的表示(邻接表)
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}

# 寻找从顶点'A'开始的最短路径
distances = bfs(graph, 'A')
print(distances)

在这个例子中,graph是一个字典,表示一个无权图的邻接表。bfs函数计算从start顶点开始到图中所有其他顶点的最短路径长度(跳数)。

最短路径广度优先搜索算法python实现样例

下面是用Python实现的最短路径广度优先搜索算法的代码示例:

from collections import deque

def bfs_shortest_path(graph, start, end):
    # 创建一个队列来保存要探索的节点
    queue = deque()
    # 将起点加入队列中
    queue.append(start)
    
    # 创建一个字典来保存节点的前驱节点
    predecessors = {}
    # 将起点的前驱节点设为None
    predecessors[start] = None
    
    while queue:
        node = queue.popleft()
        
        # 如果找到终点,则构建最短路径并返回
        if node == end:
            path = []
            while node is not None:
                path.append(node)
                node = predecessors[node]
            path.reverse()
            return path
        
        # 遍历当前节点的所有邻居节点
        for neighbor in graph[node]:
            if neighbor not in predecessors:
                queue.append(neighbor)
                predecessors[neighbor] = node
    
    # 如果没有找到最短路径,则返回空列表
    return []

使用示例:

graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D'],
    'C': ['A', 'E'],
    'D': ['B', 'E', 'F'],
    'E': ['C', 'D', 'G'],
    'F': ['D'],
    'G': ['E']
}

start = 'A'
end = 'G'

shortest_path = bfs_shortest_path(graph, start, end)
print(f"The shortest path from {start} to {end} is: {shortest_path}")

输出结果:

The shortest path from A to G is: ['A', 'C', 'E', 'G']

注意:这个算法只能处理无权图,对于带权图,需要使用Dijkstra算法或A*算法来计算最短路径。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐