不同情况下的BFS模版


1️⃣ 标准 BFS 模板(遍历整个图)

适用于一般的 无向图 / 有向图 遍历,不计算最短路径,仅用于层序遍历找到目标点

from collections import deque

def bfs(graph, start):
    queue = deque([start])  # BFS 队列
    visited = set([start])  # 记录访问过的节点

    while queue:
        node = queue.popleft()  # 取出当前节点
        print(node)  # 处理当前节点(这里是打印)

        for neighbor in graph[node]:  # 遍历所有邻居
            if neighbor not in visited:
                visited.add(neighbor)  # 标记访问
                queue.append(neighbor)  # 入队

2️⃣ 单次 BFS 计算最短路径(无权图)

适用于 无向图 / 有向图,求从起点到所有点的最短路径

from collections import deque

def bfs_shortest_path(n, edges, start=0):
    graph = [[] for _ in range(n)]  # 构建邻接表
    for u, v in edges:
        graph[u].append(v)
        graph[v].append(u)

    queue = deque([start])
    distance = [-1] * n  # -1 表示未访问
    distance[start] = 0

    while queue:
        node = queue.popleft()
        for neighbor in graph[node]:
            if distance[neighbor] == -1:  # 还未访问
                distance[neighbor] = distance[node] + 1
                queue.append(neighbor)

    return distance

适用条件:图是无权重的,每条边权值相同。


3️⃣ BFS 寻找最短路径(带路径回溯)

适用于 无向图 / 有向图,求 startend 的最短路径,并返回路径。

from collections import deque

def bfs_find_path(graph, start, end):
    queue = deque([(start, [start])])  # 记录路径
    visited = set([start])

    while queue:
        node, path = queue.popleft()

        if node == end:
            return path  # 找到路径,直接返回

        for neighbor in graph[node]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append((neighbor, path + [neighbor]))  # 更新路径

    return []  # 若无路径返回空列表

适用条件无权图最短路径问题,但需要返回具体路径。


4️⃣ 迷宫求解 / 二维网格 BFS

适用于 二维矩阵 / 迷宫 / 棋盘格,用于寻找最短路径或遍历所有可达点。

from collections import deque

def bfs_maze(grid, start):
    rows, cols = len(grid), len(grid[0])
    directions = [(-1,0), (1,0), (0,-1), (0,1)]  # 上下左右移动
    queue = deque([start])  # BFS 队列
    visited = set([start])

    while queue:
        x, y = queue.popleft()
        print(f"访问: {(x, y)}")  # 处理当前点

        for dx, dy in directions:  # 遍历四个方向
            nx, ny = x + dx, y + dy
            if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 0 and (nx, ny) not in visited:
                visited.add((nx, ny))
                queue.append((nx, ny))  # 入队

# 示例迷宫:0 表示可走,1 表示障碍物
maze = [
    [0, 0, 1, 0],
    [1, 0, 1, 0],
    [0, 0, 0, 0]
]
bfs_maze(maze, (0, 0))

适用条件:网格地图、迷宫、棋盘等二维 BFS 问题。


5️⃣ 双向 BFS(适用于搜索空间大的情况)

适用于 起点到终点的最短路径,相比普通 BFS 更快

from collections import deque

def bidirectional_bfs(graph, start, end):
    if start == end:
        return 0

    front_queue = deque([start])
    back_queue = deque([end])
    front_visited = {start: 0}
    back_visited = {end: 0}

    while front_queue and back_queue:
        # 从前向后扩展
        node = front_queue.popleft()
        for neighbor in graph[node]:
            if neighbor in back_visited:  # 交汇
                return front_visited[node] + back_visited[neighbor] + 1
            if neighbor not in front_visited:
                front_visited[neighbor] = front_visited[node] + 1
                front_queue.append(neighbor)

        # 从后向前扩展
        node = back_queue.popleft()
        for neighbor in graph[node]:
            if neighbor in front_visited:  # 交汇
                return front_visited[neighbor] + back_visited[node] + 1
            if neighbor not in back_visited:
                back_visited[neighbor] = back_visited[node] + 1
                back_queue.append(neighbor)

    return -1  # 无法到达

# 示例图
graph = {
    0: [1, 2],
    1: [0, 3, 4],
    2: [0, 5],
    3: [1],
    4: [1],
    5: [2]
}
print(bidirectional_bfs(graph, 0, 5))  # 输出 2

适用条件起点到终点的最短路径搜索,可大幅减少搜索空间。


总结

BFS 版本适用场景
标准 BFS遍历整个图
单次 BFS 计算最短路径无权图最短路径(起点到所有点)
BFS 找最短路径(带路径回溯)具体的路径(非仅距离)
二维网格 BFS迷宫、地图、棋盘等问题
双向 BFS起点到终点最短路径,搜索空间大时更优

📌 如果只是遍历整个图,标准 BFS 就够用。
📌 如果要计算最短路径,就需要用 distance 数组或 path 记录路径。
📌 对于大规模搜索,可以考虑 双向 BFS,提高效率。 🚀

<think>好的,用户需要DFS和BFS算法模板和实现示例。首先,我需要回忆一下这两种算法的基本概念和步骤。DFS通常用递归或栈实现,而BFS用队列。接下来得确认用户是否需要代码示例,以及用什么编程语言。用户提供的示例中用了Python,所以可能倾向于Python的代码。 然后,要确保模板的正确性,比如DFS的递归和迭代写法,BFS的标准队列处理。还要考虑是否需要注释说明每一步的作用,让用户更容易理解。此外,用户提到了引用资料,需要检查是否有相关的引用可以对应到内容里。例如,引用[3]提到BFS用于找最短路径,这点可以在BFS部分提到。 接下来,要组织回答结构。先简要介绍DFS和BFS,然后分别给出模板和代码示例。可能还需要比较两者的区别和应用场景,但用户主要问的是模板和实现,所以这部分可以放在相关问题里。同时,要确保代码符合格式要求,使用正确的LaTeX语法,比如变量用$...$包裹。 需要注意用户提供的引用内容,比如引用[4]解释了BFS是逐层遍历,所以在描述BFS时应该提到这一点。同时,引用[3]提到BFS找的是最短路径,这在BFS的应用中很重要,应该强调。 在编写代码时,要检查语法是否正确,比如Python的队列操作是否使用deque,递归的终止条件是否明确。此外,示例应用场景,比如二叉树的遍历,可能有助于用户理解模板的使用。 最后,生成相关问题,考虑用户可能的后续疑问,比如性能比较、应用场景、优化方法等。确保问题覆盖常见的学习点,帮助用户深入理解。</think>### 深度优先搜索(DFS)与广度优先搜索(BFS算法模板 #### 1. **DFS 算法模板** DFS 通过递归或栈实现,优先探索“深度”方向,适合解决路径问题、连通性问题等[^3]。 **递归模板(以二叉树遍历为例)**: ```python def dfs(node): if node is None: # 终止条件 return # 处理当前节点(前序遍历) print(node.val) dfs(node.left) # 递归左子树 dfs(node.right) # 递归右子树 ``` **迭代模板(使用栈)**: ```python def dfs_iterative(root): stack = [root] while stack: node = stack.pop() if node: # 处理当前节点 print(node.val) stack.append(node.right) # 右子节点先入栈(后处理) stack.append(node.left) # 左子节点后入栈(先处理) ``` #### 2. **BFS 算法模板** BFS 通过队列实现,逐层扩展搜索,适合找最短路径、层序遍历等[^4]。 ```python from collections import deque def bfs(root): queue = deque([root]) while queue: level_size = len(queue) for _ in range(level_size): # 遍历当前层所有节点 node = queue.popleft() # 处理当前节点 print(node.val) if node.left: queue.append(node.left) # 左子节点入队 if node.right: queue.append(node.right) # 右子节点入队 ``` --- ### **示例应用场景** - **DFS**:二叉树的前/中/后序遍历、图的连通性判断、回溯问题(如八皇后)[^2]。 - **BFS**:二叉树层序遍历、最短路径(如迷宫问题)、社交网络中的“六度空间”理论。 --- ### **对比与核心区别** 1. **数据结构**:DFS用栈(递归隐式栈),BFS用队列。 2. **搜索顺序**:DFS优先深度,BFS优先广度。 3. **空间复杂度**:BFS通常高于DFS(尤其在树形结构较宽时)。 4. **适用场景**:DFS适合存在性判断,BFS适合最短路径问题[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值