news 2026/5/15 21:21:02

BFS与最短路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BFS与最短路径

BFS

基本步骤

要实现图的广度优先遍历,需要借助队列这一结构。

  1. 将入口顶点入队,同时标记为已访问
  2. 若队列不为空,则从队列中取出一个顶点访问
  3. 检查与该顶点相连的其它顶点,若没有被访问过则入队,同时标记为已访问
  4. 重复2、3步骤

示例代码

下面举一个例子:

#include<iostream>#include<vector>#include<queue>std::vector<std::vector<int>>g_Graph;staticvoidInput(){intvertexNums,edgeNums;std::cin>>vertexNums>>edgeNums;g_Graph.resize(vertexNums+1,std::vector<int>(vertexNums+1));intfrom,to,weight;for(size_t i=0;i<edgeNums;i++){std::cin>>from>>to>>weight;g_Graph[from][to]=weight;g_Graph[to][from]=weight;}}staticvoidBFS(){std::vector<bool>visited(g_Graph.size(),false);std::queue<int>queue;queue.push(1);visited[1]=true;intvertex;while(!queue.empty()){vertex=queue.front();queue.pop();std::cout<<vertex<<' ';for(size_t i=1;i<g_Graph.size();i++){if(!visited[i]&&g_Graph[vertex][i]!=0){queue.push(i);visited[i]=true;}}}std::cout<<std::endl;}intmain(){Input();BFS();return0;}

读者可以用这个代码自行测试。

BFS与无权图最短路径查找

BFS可以用于查找无权图的最短路径。BFS是层层递进进行遍历的,第一次访问某一个顶点的时候,此时经过的路径就是从起始顶点到该顶点的最短路径。

下面是示例代码:

staticstd::vector<std::vector<int>>g_Graph;staticvoidBFSGetShortestPath(intstart,inttarget){std::vector<bool>visited(g_Graph.size(),false);std::queue<int>queue;std::vector<int>parent(g_Graph.size(),-1);// 用于回溯路径,下标为顶点,元素为其上一个顶点queue.push(start);visited[start]=true;intvertex;while(!queue.empty()){vertex=queue.front();queue.pop();if(vertex==target)// 如果当前访问的顶点是目标顶点{std::vector<int>path;intcursor=target;while(cursor!=-1)// 通过parent获得路径{path.push_back(cursor);cursor=parent[cursor];}std::reverse(path.begin(),path.end());// 反转之后得到正确的路径for(auto&a:path)std::cout<<a<<' ';std::cout<<std::endl;return;}for(size_t i=1;i<g_Graph.size();i++)// 正常的BFS遍历操作{if(visited[i]==false&&g_Graph[vertex][i]!=0)// 遍历vertex的邻接顶点{queue.push(i);visited[i]=true;parent[i]=vertex;}}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 2:37:43

Mermaid Live Editor 终极指南:从图表小白到专业绘图的完整教程

Mermaid Live Editor 终极指南&#xff1a;从图表小白到专业绘图的完整教程 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-li…

作者头像 李华
网站建设 2026/5/11 13:27:13

TBOX内存管理终极指南:5大高效优化技巧让性能翻倍

TBOX内存管理终极指南&#xff1a;5大高效优化技巧让性能翻倍 【免费下载链接】layui-admin 基于layui和thinkphp6.0的快速后台开发框架。快速构建完善的管理后台&#xff0c;内置表单、表格的php生成&#xff0c;以及完善的RBAC权限管理。 项目地址: https://gitcode.com/gh…

作者头像 李华
网站建设 2026/5/9 19:29:40

FFXIV TexTools模组制作工具全方位使用手册

FFXIV TexTools模组制作工具全方位使用手册 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI 作为最终幻想14玩家定制游戏体验的得力助手&#xff0c;FFXIV TexTools凭借其强大的功能和直观的操作界面&#xff0c;已…

作者头像 李华
网站建设 2026/5/9 16:05:04

DLT Viewer入门精讲:10分钟掌握汽车日志分析核心技术

DLT Viewer入门精讲&#xff1a;10分钟掌握汽车日志分析核心技术 【免费下载链接】dlt-viewer 项目地址: https://gitcode.com/gh_mirrors/dlt/dlt-viewer DLT Viewer是一款专为汽车电子和嵌入式系统设计的诊断日志分析工具&#xff0c;支持实时监控、数据解析和故障诊…

作者头像 李华
网站建设 2026/4/18 3:31:29

39、深入了解Solaris文件系统框架

深入了解Solaris文件系统框架 1. Solaris文件系统框架概述 Solaris引入了虚拟文件系统框架,在此框架下可实现多种文件系统类型。早期的Unix实现通常为所有挂载的文件系统使用单一的文件系统类型,比如BSD Unix的UFS文件系统。虚拟文件系统框架的开发是为了让Sun的分布式计算…

作者头像 李华
网站建设 2026/5/15 2:48:40

【学习心得】基于FunASR推理的SenseVoiceSmall模型来实现语音识别

一、介绍一下SenseVoiceSmall 1、什么是SenseVoiceSmall SenseVoice是多语言音频理解模型&#xff0c;支持语音识别、语种识别、语音情感识别、声学事件检测、逆文本正则化等能力&#xff0c;采用工业级数十万小时的标注音频进行模型训练&#xff0c;保证了模型的通用识别效果…

作者头像 李华