📌  相关文章
📜  使用 BFS 打印从给定源到目的地的所有路径(1)

📅  最后修改于: 2023-12-03 15:22:09.700000             🧑  作者: Mango

使用BFS打印从给定源到目的地的所有路径

什么是BFS

BFS(Breadth First Search)即广度优先搜索是图论中一种重要的搜索算法,常被用于解决最短路径问题,如寻找两点之间的最短路径,它也被称为宽度优先搜索。

BFS算法原理

BFS从起点出发,首先访问起点,然后访问起点的一度节点,再访问二度节点,以此类推,直到所有的节点都被访问为止。

BFS遍历图的过程是按层来进行的,每一层的节点都是和起点距离相同的节点,所以在遍历的时候可以用队列来存放每一层的节点,这样在遍历完一层后,再访问队列中的下一层节点。

BFS算法步骤

BFS算法的步骤如下:

  1. 将起点加入队列。
  2. 标记起点已经访问。
  3. 取出队首节点,并将其周围未曾访问的节点加入队列。
  4. 标记这些节点已经访问。
  5. 重复步骤3-4,直到找到目标节点或遍历所有节点。
代码演示

下面是使用Python语言实现使用BFS打印从给定源到目的地的所有路径的示例代码:

from collections import deque

def bfs_find_all_paths(graph, start, end):
    paths = []
    queue = deque([(start, [start])])
    while queue:
        node, path = queue.popleft()
        if node == end:
            paths.append(path)
        else:
            for next_node in graph[node] - set(path):
                queue.append((next_node, path + [next_node]))
    return paths

其中,函数bfs_find_all_paths的参数说明如下:

  1. graph:表示图的邻接表;
  2. start:表示起点的节点;
  3. end:表示终点的节点。

函数返回所有的从起点到终点的路径。

示例

假设有如下图的邻接表:

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

如果要从节点A出发,找到节点F所有的路径,可以调用函数bfs_find_all_paths进行计算:

result = bfs_find_all_paths(graph, 'A', 'F')
print(result)

结果为:

[
    ['A', 'D', 'F'], 
    ['A', 'B', 'E', 'F'], 
    ['A', 'C', 'E', 'F']
]

可以看到,从节点A到节点F有三条路径,分别是A->D->F,A->B->E->F和A->C->E->F。