首页 > 其他分享 >BFS

BFS

时间:2025-01-09 15:10:33浏览次数:1  
标签:queue 队列 BFS 访问 visited 节点

BFS(广度优先搜索,Breadth-First Search)是一种用于遍历或搜索树或图的算法。它的核心思想是从起始节点开始,逐层向外扩展,先访问离起始节点最近的节点,再访问更远的节点。BFS通常使用队列(Queue)来实现。


BFS的核心思想

  1. 逐层扩展

    • 从起始节点开始,先访问所有与起始节点直接相连的节点(第一层)。
    • 然后访问与第一层节点相连的节点(第二层),依此类推。
  2. 队列的使用

    • 使用队列来存储待访问的节点。
    • 每次从队列中取出一个节点,访问其所有未访问的邻居节点,并将这些邻居节点加入队列。
  3. 避免重复访问

    • 使用一个集合或数组来记录已访问的节点,确保每个节点只被访问一次。

BFS的步骤

  1. 初始化

    • 将起始节点加入队列,并标记为已访问。
  2. 遍历队列

    • 从队列中取出一个节点,访问该节点。
    • 将该节点的所有未访问的邻居节点加入队列,并标记为已访问。
  3. 重复直到队列为空

    • 继续上述过程,直到队列为空,表示所有可达节点都已访问。

BFS的实现

以下是BFS的Python实现:

from collections import deque

def bfs(graph, start):
    visited = set()  # 记录已访问的节点
    queue = deque([start])  # 使用队列存储待访问的节点
    
    while queue:
        node = queue.popleft()  # 取出队列中的第一个节点
        if node not in visited:
            print(node)  # 访问当前节点(例如打印)
            visited.add(node)  # 标记为已访问
            # 将所有未访问的邻居节点加入队列
            for neighbor in graph[node]:
                if neighbor not in visited:
                    queue.append(neighbor)

# 示例调用
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}
bfs(graph, 'A')

BFS的输出

对于上述图:

img

  1. queue = [A], pop(A), queue = [B, C], visited = [A]
  2. pop(B), queue = [C, D, E], visited = [A, B]
  3. pop(C), queue = [D, E], visited = [A, B, C]
  4. pop(D), queue = [E], visited = [A, B, C, D]
  5. pop(E), queue = [F], visited = [A, B, C, D, E]
  6. pop(F), queue = [], visited = [A, B, C, D, E, F]

BFS的输出结果为:

A
B
C
D
E
F

BFS的特点

  1. 时间复杂度

    • 邻接表表示:O(V + E),其中V是节点数,E是边数。
    • 邻接矩阵表示:O(V²)。
  2. 空间复杂度

    • O(V),取决于队列的大小。
  3. 适用场景

    • 寻找最短路径(在无权图中)。
    • 层级遍历树或图。
    • 检测图中是否存在环。
    • 解决迷宫问题。

BFS的应用示例

1. 寻找最短路径(无权图)

  • 在无权图中,BFS可以找到从起始节点到目标节点的最短路径(最少边数)。

2. 层级遍历

  • 对树或图进行层级遍历,逐层访问节点。

3. 检测图中是否存在环

  • 在无向图中,如果BFS过程中遇到一个已经访问过的节点,并且该节点不是当前节点的父节点,则说明图中存在环。

BFS与DFS的区别

特性 BFS DFS
数据结构 队列 栈(递归或显式栈)
遍历方式 广度优先 深度优先
空间复杂度 O(V)(队列大小) O(V)(递归深度)
适用场景 最短路径、层级遍历 寻找路径、检测环、拓扑排序

总结

BFS是一种基于队列的图遍历算法,适合解决需要逐层扩展的问题,如寻找最短路径、层级遍历等。它的实现简单直观,是图论中最基础的算法之一。

标签:queue,队列,BFS,访问,visited,节点
From: https://www.cnblogs.com/codersgl-blog/p/18662190

相关文章

  • DFS与BFS专题
    99.岛屿数量讲解:https://programmercarl.com/kamacoder/0099.岛屿的数量广搜.html#思路DFS代码#include<iostream>#include<cstring>usingnamespacestd;constintN=55;intn,m;intg[N][N];boolst[N][N];intdx[4]={-1,0,1,0},dy[4]={0,1,0,-1......
  • Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [
    Paper-cutting:思维很好,但代码很构式的manacher题。蒟蒻2025年切的第一道题,是个紫,并且基本独立想出的,特此纪念。判断能否折叠我们先考虑一部分能折叠需要满足什么条件。显然,这一部分需要是一个长度为偶数的回文串。那么横向和纵向会不会影响呢?答案是不会,因为横向折了之后,折......
  • bfs
    includeincludeincludeusingnamespacestd;defineV_NUM5boolvisited[V_NUM];intG[V_NUM][V_NUM];queueQ;voidvisite(intv){printf("%d",v);}voidG_init(){G[0][1]=1;G[0][2]=1;G[1][0]=1;G[1][3]=1;G[2][0]=1;G[2][3]=1;G[3][1]=1;G[3......
  • 流星雨(BFS)
    题目:链接:https://vjudge.net/problem/POJ-3669题意:流星雨来袭,一共有m颗陨石,每颗ti时间点的陨石砸击(xi,yi)以及其上下左右共5个点,在砸击的时刻及砸击后人都不能踏上这个点。在第一象限内,人位于原点(0,0),每次可以上下左右移动一次,找到达到安全位置的最短时间思路:开一张数表maze初始化......
  • 【算法】【优选算法】宽搜(BFS)中队列的使用
    目录一、429.N叉树的层序遍历二、103.⼆叉树的锯⻮形层序遍历三、662.⼆叉树最⼤宽度四、515.在每个树⾏中找最⼤值一、429.N叉树的层序遍历题目链接:429.N叉树的层序遍历题目描述:题目解析:层序遍历N叉树,每一层的节点是由null分开每一层节点的val值放入一个数......
  • BFS广度优先
    个人最喜欢的算法之一,这是一种犹如洪水般的算法,O(n)的时间复杂度。##红色不可流动,橙色可流动,黄色所在点,蓝色在队列里。就像洪水一样,当你得到某个位置时候,开始判断它的上下左右是否可流动并判断有没有流过。 开始判断它的上下左右是否可流动并判断有没有流过,若可以放入上下左......
  • Cheese Aizu - 0558 (BFS)
    题目链接:https://vjudge.net/problem/Aizu-0558#author=GPT_zh题意:给你一个h*w的矩阵,(.代表空地。X代表障碍物,数字1~n分别代表n个不同的cheese)老鼠从起始位置S开始,挨个去找和它能力值(power)相等的cheese去吃,输出吃完n个cheese所需要的步长。思路:BFS搜索,即先找和power相同的c......
  • 一篇入门广度优先搜索BFS
    注:本篇博客参考《算法图解》,读者阅读BFS一篇时大受启发所以想要记录下来并搭配例题给网友分享。BFS解决的问题从节点A出发,有前往节点B的路径吗?从节点A出发,前往节点B的哪条路径最短?应用:图的遍历搜索,最短路径,层级遍历,网络爬虫等一个例子+一个例题搞懂BFS把人和人的关......
  • 《Detecting probe resistant proxy》论文阅读、验证与obfs4proxy分析
    1引言当时看到这篇对代理检测的论文,对它的中文讨论较少,整理了自己阅读和实验后的笔记(关注于tor的obfs4),方便有需要的同学一起学习讨论。(现在obfs4都要过时啦,出了新的WebTunnels,但是嘛,升级迭代也要相当一段时间了)2论文阅读2.1探针选择我们的攻击集中在这样一个观察上,......
  • BFS入门笔记
    BFS入门笔记BFS广度优先搜索,在处理问题时,优先考虑更多的机会,而不是像DFS那样优先走一条路,再回溯BFS基于队列实现,目的是把可能的解放在同一层处理,即BFS队列中至多只有两层的解考虑完前一层可能的解后,再考虑下一层的解。把当前解的后续解再放到队列尾部。如上图中,BCDE处在同一......