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

图BFS核心:最短路径与万能模板

一、图 BFS 核心思想

广度优先搜索:从起点开始,一层一层向外扩散访问

  • 先走当前点所有邻居 → 再走邻居的邻居
  • 队列 queue实现
  • 无权图中,BFS 走到终点的路径 =最短路径

对比 DFS:

  • DFS:一条路走到黑,适合找所有路径
  • BFS:层层扩散,适合求最短路径

二、必备结构

  1. 邻接表:vector<int> adj[]
  2. 访问标记数组:bool vis[]
  3. 队列:存储待访问顶点

三、图 BFS 标准万能模板

#include <iostream> #include <vector> #include <queue> #include <cstring> using namespace std; const int N = 105; vector<int> adj[N]; bool vis[N]; void bfs(int start) { queue<int> q; q.push(start); vis[start] = true; while(!q.empty()) { int u = q.front(); q.pop(); cout << u << " "; // 遍历所有邻接点 for(int v : adj[u]) { if(!vis[v]) { vis[v] = true; q.push(v); } } } }

四、无向图建图 + 完整测试

void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } int main() { memset(vis, false, sizeof(vis)); addEdge(1,2); addEdge(1,3); addEdge(2,4); addEdge(3,4); addEdge(5,6); cout << "BFS从顶点1遍历:"; bfs(1); return 0; }

五、BFS 求无权图最短路径(刷题高频)

增加距离数组 dist [],初始为 - 1 代表未访问

int dist[N]; void bfs_short(int start) { queue<int> q; memset(dist, -1, sizeof(dist)); dist[start] = 0; q.push(start); while(!q.empty()) { int u = q.front(); q.pop(); for(int v : adj[u]) { if(dist[v] == -1) { dist[v] = dist[u] + 1; q.push(v); } } } }

dist [end] 就是起点到终点最短步数

六、多连通图完整遍历(统计连通块)

int main() { memset(vis,false,sizeof(vis)); int cnt = 0; for(int i = 1; i <= 6; i++) { if(!vis[i]) { cnt++; cout << "\n第"<<cnt<<"块:"; bfs(i); } } return 0; }

七、DFS vs BFS 刷题选型口诀

  1. 最短路径、最少步数、迷宫最短出口→ 用 BFS
  2. 所有路径、回溯、连通块填充、岛屿问题→ 用 DFS
  3. 数据量大怕递归栈溢出 → 优先 BFS
  4. 路径回溯、组合问题 → 优先 DFS

八、BFS 刷题经典场景

  1. 迷宫最短路径
  2. 岛屿问题层序扩散
  3. 拓扑排序基础
  4. 多源最短路
  5. 二叉树层序遍历本质就是图 BFS 特例

九、新手易错点

  1. 入队时不提前标记 vis,导致重复入队死循环
  2. 混淆 DFS 递归、BFS 队列实现方式
  3. 求最短路径还用 DFS,得到的不是最短
  4. 多连通图只遍历单个起点

十、今日总结

  1. BFS = 队列 + 层层扩散遍历
  2. 无权图 BFS 天然得到最短路径
  3. DFS 深搜、BFS 广搜,两种模板必须熟练默写
  4. 图论两大遍历学会,后续最短路径、拓扑排序直接上手
http://www.cnnetsun.cn/news/2461725.html

相关文章:

  • 2026年阿里云OpenClaw/Hermes Agent配置Token Plan新手必看教程
  • 水培种菜翻车了?可能是水质问题!用NodeMCU和TDS传感器给你的营养液做个“体检”
  • 联想/兄弟打印机在银河麒麟系统下的‘替身’安装法:以M7450F Pro为例
  • Meshroom 3D重建:从零开始掌握节点式视觉编程的5个关键步骤 [特殊字符]
  • 程序员、产品经理、项目经理、普通人转行AI大模型教程
  • 书匠策AI到底是什么来头?毕业论文写作的“黑科技“我给你扒明白了
  • Perplexity算法与传统BM25查询评分的本质差异(仅0.3%的AI平台工程师真正理解)
  • WinDirStat终极指南:如何快速找到并清理Windows磁盘空间
  • 2026亚洲消费电子展6月启幕!
  • CTF-Web实战:php_mt_seed工具在mt_rand()种子破解中的应用
  • CAXA 正多边形命令
  • 高效解决Windows依赖问题的智能工具完全指南:Visual C++ Redistributable AIO深度解析
  • CAXA 公式曲线
  • Claude 4 系列正式发布:Opus 4 与 Sonnet 4 全新特性全解析
  • 终极指南:USTC LaTeX论文模板深度配置与高效排版技巧
  • 为什么国内直播平台都爱用HTTP-FLV?从Flash消亡到MSE时代的流媒体技术选型内幕
  • 从MySQL DBA视角看OceanBase:多租户、分区策略与日常运维到底有啥不同?
  • 研华MIO-5350嵌入式主板解析:Apollo Lake平台在严苛环境下的应用
  • 2026年AIGC检测升级后,这些降重软件才是真正的清关王者——知网维普双降经验分享(重复率与AIGC疑似率双降)
  • 印第安纳大学突破:AI隐藏记忆实现可视化与可编辑能力提升
  • Perplexity考试搜索避坑清单,12个被官方刻意隐藏的关键字段与3种反爬识别绕过策略
  • 别再乱用CLS了!用HuggingFace Transformers时,last_hidden_state和pooler_output到底该选哪个?(附代码对比)
  • 告别混乱!用TortoiseGit和WinMerge高效管理代码改动(含图像文件对比技巧)
  • 从波士顿团队到个人制造:构建智能补偿的桌面级数控系统
  • P1280 尼克的任务【洛谷算法习题】
  • 从GPIO入手,深度解析HPM6750 RISC-V MCU开发板底层驱动与实战技巧
  • 虚拟机共享文件挂载
  • RFSoC玩转跳频通信:从NCO配置到多片同步的实战指南(Zynq UltraScale+ RFSoC Gen 3)
  • Perplexity AI界面配色深度解析(WCAG 2.1 AA级通过率98.6%实测方案)
  • 大厂测试团队的组织架构:不同规模公司的测试团队有何不同