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

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;}}}}
http://www.cnnetsun.cn/news/120767.html

相关文章:

  • 77、Linux技术综合指南:从IP别名到系统配置
  • Onekey:轻松获取Steam游戏清单的终极解决方案
  • LX Music Desktop:重新定义免费音乐播放的颠覆性选择
  • Mod Organizer 2新手教程:轻松管理游戏模组的必备工具
  • 如何用GKD实现手机自动化操作:新手指南与实战技巧
  • 如何用文本绘图魔法快速绘制专业流程图
  • n8n第十三节 三个节点测试技巧
  • EmotiVoice结合大模型token服务实现按需语音生成
  • LeaguePrank:英雄联盟身份伪装工具完全指南
  • 115proxy-for-kodi插件:让Kodi直接播放115网盘高清视频的完整教程
  • 电动汽车电池数据集终极指南:29个月真实数据深度解密
  • Kotaemon如何支持结构化数据与非结构化数据混合检索?
  • 百度网盘解析工具终极指南:如何免费突破限速实现高速下载
  • 19、Linux内核模块安装与打印服务器配置全解析
  • 18、Kubernetes 监控与日志管理:从基础到实战
  • KH Coder终极指南:免费开源文本分析工具快速上手
  • 7、Linux桌面环境全解析:选择与使用指南
  • MCA Selector:Minecraft世界区块管理的终极解决方案
  • 5个必学的动态图标状态管理技巧:让你的界面活起来
  • RK3568设备Armbian服务器改造全攻略:从闲置电视盒子到高性能服务器
  • AssetStudio深度解析:解锁Unity资源提取的专业工具
  • Windows包管理器Winget快速部署全攻略
  • Kotaemon框架的测试驱动开发实践
  • 7、VMware使用指南:功能特性与操作详解
  • 8、VMware虚拟机硬件配置与操作指南
  • 13、VMware 中 Linux 客户操作系统的使用与配置
  • 14、Linux 系统下 VMware 的使用指南
  • Day 1:Git入门避坑:新手3步搞定首次提交
  • 3、开启 Linux 世界之旅:成为企鹅爱好者
  • 20、量子计算中的博弈与搜索算法