当前位置: 首页 > news >正文

广度优先算法(BFS)

BFS 的核心特点

1、按层遍历:先访问起始节点(第一层),然后访问所有与起始节点直接相连的节点(第二层),接着访问与第二层节点相连且未访问的节点(第三层),以此类推。

2、最短路径特性:在无权图中,BFS 找到从起点到任意可达节点的路径一定是边数最少的路径(即最短路径,每条边权重视为1)。

3、数据结构:通常使用队列(queue) 来实现。先入队的节点先被扩展,保证了“先来先服务”的层层推进顺序。

与DFS的区别

BFS
数据结构 队列
遍历顺序 按层,宽方向
最短路径 无权图的最短路径
空间消耗 通常较大(尤其宽图)
典型应用 最短路径、层序遍历、连通性
DFS
数据结构(或递归)
遍历顺序 沿一条路径深入,再回溯
最短路径 不一定得到最短路径
空间消耗 通常较小(尤其深图)
典型应用 拓扑排序、连通分量、回溯问题

题目



代码:

#include<iostream>#include<queue>#include<vector>#include<algorithm>usingnamespacestd;// 搜索顺序:右、下、左、上constintdirOrder[4][2]={{0,1},{1,0},{0,-1},{-1,0}};// 节点结构体,表示BFS队列中的元素structNode{intx,y;// 节点坐标intsteps;// 从起点到当前节点的步数};boolBFS(constvector<vector<int>>&maze,intm,intn,intstartX,intstartY,intendX,intendY,int&minSteps,vector<pair<int,int>>&path){// 使用vector动态初始化访问标记数组vector<vector<bool>>visited(m+1,vector<bool>(n+1,false));// 使用vector动态初始化前驱节点数组vector<vector<int>>preX(m+1,vector<int>(n+1,-1));vector<vector<int>>preY(m+1,vector<int>(n+1,-1));queue<Node>q;// 创建BFS队列q.push({startX,startY,0});// 起点入队,步数为0visited[startX][startY]=true;// 标记起点已访问// BFS主循环while(!q.empty()){Node cur=q.front();// 取出队首节点q.pop();// 到达终点if(cur.x==endX&&cur.y==endY){minSteps=cur.steps;// 记录最短步数// 从终点回溯重建路径intcurX=endX,curY=endY;while(curX!=-1&&curY!=-1){path.push_back({curX,curY});// 将当前节点加入路径inttx=preX[curX][curY];// 获取前驱节点x坐标intty=preY[curX][curY];// 获取前驱节点y坐标curX=tx;// 移动到前驱节点curY=ty;}reverse(path.begin(),path.end());// 反转得到从起点到终点的顺序returntrue;// 找到路径,返回成功}// 按顺序扩展四个方向:右、下、左、上for(inti=0;i<4;i++){intnx=cur.x+dirOrder[i][0];// 新节点的x坐标intny=cur.y+dirOrder[i][1];// 新节点的y坐标// 检查边界if(nx>=1&&nx<=m&&ny>=1&&ny<=n){// 检查是否可通行且未访问if(maze[nx][ny]==0&&!visited[nx][ny]){visited[nx][ny]=true;// 标记为已访问preX[nx][ny]=cur.x;// 记录前驱节点的x坐标preY[nx][ny]=cur.y;// 记录前驱节点的y坐标q.push({nx,ny,cur.steps+1});// 新节点入队,步数+1}}}}returnfalse;// 队列为空仍未找到终点,返回失败}intmain(){intm,n;cin>>m>>n;// 使用vector动态创建迷宫矩阵(1-indexed,多分配一行一列方便使用)vector<vector<int>>maze(m+1,vector<int>(n+1,0));// 读入迷宫矩阵for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){cin>>maze[i][j];}}// 读入起点和终点坐标intstartX,startY,endX,endY;cin>>startX>>startY>>endX>>endY;intminSteps=-1;// 存储最短步数vector<pair<int,int>>path;// 存储路径坐标// 调用BFS算法if(BFS(maze,m,n,startX,startY,endX,endY,minSteps,path)){// 找到路径,输出步数和路径cout<<minSteps<<endl;for(size_t i=0;i<path.size();i++){cout<<path[i].first<<path[i].second;// 输出坐标(无空格拼接)if(i!=path.size()-1)cout<<" ";// 坐标之间用空格分隔}cout<<endl;}else{// 未找到路径,输出-1cout<<-1<<endl;}return0;}

总结

BFS 是一种 逐层扩散 的搜索策略。
需要 队列 辅助,并记录 已访问 节点。
在 无权图 中能保证找到 最短路径。
适用于需要找最近距离或最少步骤的问题。

http://www.cnnetsun.cn/news/2210951.html

相关文章:

  • 等保四级Java医疗平台改造全解析,覆盖密码算法替换、审计日志增强、双因子认证集成及漏洞闭环管理
  • 现代图形API中的管线状态对象(PSO)优化实践
  • Sunshine游戏串流终极指南:三分钟搭建你的跨平台游戏服务器
  • 2026年等离子清洗机定制哪家强?答案即将揭晓!
  • 开源成本监控利器costclaw-telemetry:云原生环境下的成本数据自动化采集实践
  • 3分钟快速上手:如何在Mac上实现NTFS硬盘自由读写
  • Python全站链接爬取工具优化-支持过滤和断点续爬
  • TrafficMonitor插件系统:构建个性化桌面监控中心的完整方案
  • 初创公司如何利用Taotoken的按Token计费模式优化AI实验成本
  • WorkshopDL:非Steam玩家的创意工坊模组下载解决方案
  • CloudBase MCP:AI编程IDE与Serverless部署的智能桥梁实战
  • 3个步骤彻底掌控你的华硕笔记本:G-Helper终极优化指南
  • Hugging Face lerobot:机器人学习的开源利器与应用实践
  • 多智能体协作:AI虚拟开发团队如何重构软件开发流程
  • 50.YOLOv8 工业级全流程实战(CUDA118):训练 + 推理 + ONNX 导出 + TensorRT 加速 + Flask 部署,全套可复制源码 + 避坑指南
  • C/C++宏函数避坑指南:从SQUARE(8+2)=26说起,手把手教你正确加括号
  • 别再让大图拖慢你的网站了!用Docker Compose一键部署imgproxy,给MinIO图片服务加个‘瘦身’插件
  • Steam成就管理终极指南:5分钟快速掌握SAM完整教程 [特殊字符]
  • 你的初面不再是人?2026 留学生如何反杀“沉浸式 AI 面试官”
  • 128. 最长连续序列
  • 从‘单打独斗’到‘团队协作’:用Python简单模拟理解APC中的多变量预测控制(MPC)
  • 游戏开发中的状态机与交互系统设计
  • Sunshine游戏串流完全指南:打造你的个人云游戏服务器终极方案
  • Filebeat vs Logstash vs Fluent Bit:三大日志采集器深度对比与选型终极指南—从零构建企业级日志管道,全面解析架构、性能、生态与云原生实践
  • 如何用Python异步架构构建小红书内容采集系统:XHS-Downloader的技术解析
  • STL体积模型计算器:3D打印成本控制与模型分析的终极利器
  • AI助手越狱攻防:从提示词工程看大模型安全边界与对抗
  • Pearcleaner:彻底解决macOS应用卸载残留问题的智能清理神器
  • FlightPHP安全防护终极指南:保护PHP微框架应用的10个实用策略
  • BinDiff入门教程:10分钟学会使用反汇编代码差异分析工具