0

0

c++怎么实现广度优先搜索bfs_c++ 队列实现与最短路径寻找【教程】

冰火之心

冰火之心

发布时间:2026-01-08 09:20:03

|

754人浏览过

|

来源于php中文网

原创

std::queue 是 C++ 中实现 BFS 的核心容器,需配合 visited 标记、邻接表存储、距离数组 dist 和边界检查;起点入队前标记 visited,每次取队首后立即 pop,遍历未访问邻居并更新 dist,避免重复入队与越界访问。

c++怎么实现广度优先搜索bfs_c++ 队列实现与最短路径寻找【教程】

std::queue 实现 BFS 的核心结构

广度优先搜索在 C++ 中最自然的实现方式就是依赖 std::queue,它保证先进先出,正好匹配 BFS 逐层扩展的逻辑。关键不是“怎么写循环”,而是“存什么、怎么标记、何时停止”。节点通常存索引或指针,但必须配合访问标记(如 vector visited),否则会重复入队甚至死循环。

  • 图的表示建议用 vector>(邻接表),比邻接矩阵更省空间且遍历快
  • 起点入队前必须设 visited[start] = true,否则可能被重复加入
  • 每次从队首取节点后立刻 pop,再遍历其所有未访问邻居——顺序不能颠倒

记录最短路径长度:用 vector 存距离而非层数计数器

很多人用一个全局 level 变量来统计层数,但这在非完全二叉树或稀疏图中极易出错。正确做法是为每个节点单独维护到达它的最短距离,初始化为 -1(未访问)或 INT_MAX,起点设为 0。每次扩展邻居时更新:dist[neighbor] = dist[current] + 1

来福FM
来福FM

来福 - 你的私人AI电台

下载
  • 这样不仅能拿到终点距离,还能回溯路径(需额外存 parent 数组)
  • 如果只关心是否存在路径,可提前在 if (neighbor == target) 时 return dist[current] + 1
  • 注意:无向图中边权为 1 才适用此方法;带权图必须换 Dijkstra

避免常见错误:重复入队、越界访问、空图处理

实际写的时候,这几个点最容易导致运行时崩溃或逻辑错误:

  • queue 为空时还调用 front()pop() → 必须每次 while (!q.empty()) 开头检查
  • 邻接表索引越界:比如节点编号从 1 开始,但 vector 下标从 0 开始 → 访问 graph[u] 前确认 u
  • 没处理孤立节点:起点本身不可达其他点,visiteddist 初始值要统一设为 -1 或无效值
  • 多起点?把多个起点同时 push 进队列,并设对应 dist 为 0 —— 这是多源 BFS 的标准写法
#include 
#include 
#include 
using namespace std;

int bfs_shortest_path(const vector>& graph, int start, int target) {
    if (start == target) return 0;
    int n = graph.size();
    vector dist(n, -1);
    queue q;
    dist[start] = 0;
    q.push(start);

    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (int v : graph[u]) {
            if (dist[v] == -1) {
                dist[v] = dist[u] + 1;
                if (v == target) return dist[v];
                q.push(v);
            }
        }
    }
    return -1; // 不可达
}
BFS 看似简单,但真正稳定跑通的关键在于:每一步入队前检查是否已访问,每一步出队后立即更新邻居状态,距离数组和访问标记必须同步维护。图结构不规范、边界没兜底,函数就可能静默返回错误结果。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

736

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

85

2023.09.25

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

33

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号