新闻中心
C++怎么实现广度优先搜索(BFS)_C++图的遍历与队列应用
广度优先搜索从起始节点开始逐层遍历,使用队列实现并用布尔数组标记访问状态,避免重复访问。示例代码展示了无向图的邻接表表示及BFS遍历过程,输出结果为0 1 2 3 4 5;通过记录队列大小可分层输出,应用于最短路径、连通性等问题,时间与空间复杂度均为O(V + E)。

广度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索图或树的算法。它从起始节点开始,先访问其所有邻接节点,再逐层向外扩展,直到遍历完所有可达节点。BFS通常使用队列(queue)来实现,保证按层次顺序访问节点。
图的表示方式
在C++中,图常用邻接表表示,可以用vector
示例:无向图的邻接表表示
vector<vector<int>> graph = {
{1, 2}, // 节点0连接1和2
{0, 3, 4}, // 节点1连接0、3、4
{0, 5}, // 节点2连接0、5
{1}, // 节点3连接1
{1}, // 节点4连接1
{2} // 节点5连接2
};BFS基本实现步骤
BFS的核心是使用队列维护待访问节点,并用布尔数组记录已访问状态,避免重复访问。
实现要点:
- 使用queue
保存待处理节点 - 使用vector
标记是否访问过 - 从起点入队,循环出队并处理其邻居
- 未访问的邻居入队并标记
C++代码实现
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void bfs(const vector<vector<int>>& graph, int start) {
int n = graph.size();
vector<bool> visited(n, false); // 标记访问状态
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " "; // 输出当前节点
// 遍历u的所有邻接节点
for (
int v : graph[u]) {
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
// 示例调用
int main() {
vector<vector<int>> graph = {{1,2}, {0,3,4}, {0,5}, {1}, {1}, {2}};
cout << "BFS tr*ersal: ";
bfs(graph, 0);
return 0;
}输出结果:
0 1 2 3 4 5
带层级信息的BFS
有时需要知道每个节点所在的层次(距离起点的步数),可以在遍历时记录层数。
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
修改版:输出每层节点
void bfsWithLevel(const vector<vector<int>>& graph, int start) {
int n = graph.size();
vector<bool> visited(n, false);
queue<int> q;
q.push(start);
visited[start] = true;
int level = 0;
while (!q.empty()) {
int size = q.size(); // 当前层的节点数
cout << "Level " << level << ": ";
while (size--) {
int u = q.front();
q.pop();
cout << u << " ";
for (int v : graph[u]) {
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
cout << endl;
level++;
}
}输出示例:
Level 0: 0 Level 1: 1 2 Level 2: 3 4 5
应用场景与注意事项
BFS常用于求解最短路径(无权图)、连通分量、拓扑排序等问题。
常见用途:
- 计算两个节点间的最短路径(边权为1)
- 判断图是否连通
- 解决迷宫最短路径问题
- 社交网络中查找好友关系层数
注意点:
- 确保图不为空,起始节点有效
- 无向图需防止来回访问(靠visited数组控制)
- 有向图同样适用,只需按邻接表方向遍历
- 空间复杂度O(V + E),时间复杂度O(V + E)
基本上就这些。掌握队列的使用和访问标记是关键。
以上就是C++怎么实现广度优先搜索(BFS)_C++图的遍历与队列应用的详细内容,更多请关注其它相关文章!
# 配置文件
# 广安网站优化找哪家好点
# 安徽营销推广产品有哪些
# 莱芜网站建设方案模板
# 河南创新网站建设哪家好
# 河北城乡建设网站
# 新余网站排名优化
# 在线工具网站seo优化
# 运动小程序营销推广方案
# SEO文案配图沙雕
# 罗源推广营销有效果吗
# 是一种
# 层数
# c++
# 解决方法
# 怎么做
# 重写
# 布尔
# 有什么
# 最短
# 遍历
# 社交网络
# stream
# ios
# ai
# 广度优先搜索
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
韩小圈电脑版在线入口_网页版免费登录地址
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
J*aScript中针对特定容器内图片动画的实现教程
J*aScript中如何高效提取对象指定属性
韩剧圈正版入口页面_韩剧圈官网登录链接
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
VS Code远程开发时如何处理文件权限问题
汽水音乐在线版入口_汽水音乐网页播放手册
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
照顾宝贝2小游戏免费秒玩入口
yandex入口引擎手机版 yandex安卓版下载入口
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
快手赚钱渠道_快手收益来源
yy漫画网页版官方入口_yy漫画官网登录页面链接
Go语言JSON解析深度指南:动态访问与结构体映射实践
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
React Hooks最佳实践:动态组件状态管理的组件化方案
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
抖音怎么赚钱_抖音创作者变现方法与途径指南
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
实现全屏滚动与导航点:专业教程
基于动态规划的房屋花卉种植最小成本算法详解
解决Flask中Quill编辑器内容提交失败及TypeError的指南
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
Python大型XML文件高效流式解析教程
解决J*aScript中重复选择项的确认对话框显示问题
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
2026春节假期票务安排_2026春节放假购票指南
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
mc.js游戏直达 mc.js网页免下载版本秒进地址
CSS Box Model与弹性按钮:维持布局稳定的动画实践


2025-11-22
浏览次数:次
返回列表
int v : graph[u]) {
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
// 示例调用
int main() {
vector<vector<int>> graph = {{1,2}, {0,3,4}, {0,5}, {1}, {1}, {2}};
cout << "BFS tr*ersal: ";
bfs(graph, 0);
return 0;
}