详解图的最短路径算法(BFS、Dijkstra、Floyd)(附上图解步骤)

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现 前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短; 阅读详情

图的最短路径

最短路径分为两种:
(1)单源路径:从某顶点出发,到其他全部顶点的最短路径
(2)顶点间的最短路径:任意两个顶点之间的最短路径
最短路径的结果主要有两个方面:
(1)顶点之间最短路径的长度
(2)从源顶点到目标顶点的路径

BFS

只有边权为 1 时才能用BFS求最短路。

为什么BFS能求边权为1的图的最短路呢?
其实可以把整个遍历路径看成一棵树
我们会看到是一层一层遍历的
也就是说 只要这个节点被访问到了,那么根节点到这个节点的最短路径就已经确定了


可以看到 2到1的最短路径就是1到6也是1
以此类推,2到8的最短路径就是3

从2出发,计算2到8的最短路径

第一步:初始化

在这里插入图片描述

d[i]=∞
path[i]=-1
d[2]=0 //2到自身的路径长度为0

1 2 3 4 5 6 7 8
d[] inf 0 inf inf inf inf inf inf
path[] -1 -1 -1 -1 -1 -1 -1 -1
1 2 3 4 5 6 7 8
visited F T F F F F F F
queue 2

第二步:从2出发,找到邻接点1、6
2出队 1、6进队

queue 1 6

在这里插入图片描述

path存的是当前节点的父节点,所以path[1] = 2 path[6] = 2

d[1] = d[2]+1 = 1
d[6] = d[2]+1 = 1

1 2 3 4 5 6 7 8
d[] 1 0 inf inf inf 1 inf inf
path[] 2 -1 -1 -1 -1 2 -1 -1
1 2 3 4 5 6 7 8
visited T T F F F T F F

第三步:节点1出队,找到邻接节点5
1出队 5进队

queue 6 5

d[5] = d[1]+1 = 2
path[5] = 1

在这里插入图片描述

1 2 3 4 5 6 7 8
d[] 1 0 inf inf 2 1 inf inf
path[] 2 -1 -1 -1 1 2 -1 -1
1 2 3 4 5 6 7 8
visited T T F F T T F F

第四步:节点6出队,找到邻接节点2、3、7
6出队 3、7进队,2访问过,忽略

queue 5 3 7

path[3] = 6
path[7] = 6
d[3] = d[7] = d[6]+1 = 2

在这里插入图片描述

1 2 3 4 5 6 7 8
d[] 1 0 2 inf 2 1 2 inf
path[] 2 -1 6 -1 1 2 6 -1
1 2 3 4 5 6 7 8
visited T T T F T T T F

第五步:节点5出队,没有邻接节点
5出队

queue 3 7

第六步:节点3出队,找到邻接节点6、4、7
3出队,4入队,6、7已经被访问过了 忽略

queue 7 4

d[4] = d[3]+1 = 2+1 = 3
path[4] = 3

在这里插入图片描述

1 2 3 4 5 6 7 8
d[] 1 0 2 3 2 1 2 inf
path[] 2 -1 6 3 1 2 6 -1
1 2 3 4 5 6 7 8
visited T T T T T T T F

第七步:节点7出队,找到邻接节点3、4、8
7出队,8入队,3、4已经被访问过了 忽略

queue 4 8

d[8] = d[7]+1 = 2+1 = 3
path[8] = 7

在这里插入图片描述

1 2 3 4 5 6 7 8
d[] 1 0 2 3 2 1 2 3
path[] 2 -1 6 3 1 2 6 7
1 2 3 4 5 6 7 8
visited T T T T T T T T

第七步:节点4出队,找到邻接节点3、7、8
3、7、8已经被访问过了 忽略

queue 8

第八步:节点8出队,找到邻接节点4、7
4、7、已经被访问过了 忽略

queue

至此,广搜结束,输出结果d[8] = 2

代码实现


const bfs = (graph,node)=>{
   
   
  const n = Object.keys(graph).length
  const visited = new Array(n+1).fill(false)
  const max = Number.MAX_SAFE_INTEGER
  const d = new Array(n).fill(max)
  const path = new Array(n+1).fill(-1)

  d[node] = 0
  visited[node] = true

  const queqe = [node]
  // 开始深搜
  while(queqe.length){
   
   
    const newnode =  queqe.shift()
    const v = graph[newnode]
    v&&v.map(item=>{
   
   
      // 这个节点没有访问过
      if(!visited[item]){
   
   
        path[item] = newnode
        d[item] = d[newnode]+1
        visited[item] = true
        queqe.push(item)
      }
    })

  }

  // 输出路径
  const rspath = [8]
  while(rspath[0]===node){
   
   
     rspath.unshift(path[rspath[0]])
  }

  console.log(rspath) // 2 6 7 8
  return d[8]  //3
}

const graph = {
   
   
  1:[2,5],
  2:[1,6],
  3:[6,7,4],
  4:[3,7,8],
  5:[1],
  6:[2,3,7],
  7:[6,3,8],
  8:[7</
数据结构:弗洛伊德算法(最短路径)图文详解 弗洛伊德算法通过邻接矩阵存储图(有向图或者无向图)的信息,两点的距离,通过动态转移方程 a[i][j] = min(a[i][j], a[i][p] + a[p][j]); 来更新最短路径,求出各个点之间的最短路径 阅读详情

相关推荐

最短路径算法(算法篇)

本篇讲述图论算法中的最短路径算法,有bfs,floyd和dijkstra算法

hellmorning的博客 2273

详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

目录1.BFS算法2.Dijkstra算法3.Floyd算法4.总结G纲是个物流离散中心,经常需要往各个城市运东西,怎么运送距离最近——单源最短路径问题各个城市之间也学要来往,相互之间怎么走距离最近?——每对顶点之间的最短路径如下图,BFS算法是如何实现最短路径问题的呢?设从顶点2开始,第一次搜索的结点为1号结点和6号结点,路径为1,从1号结点和6号结点开始找相邻的接地,5号结点和3号7号为相邻的结点,然后5号结点周围都是已经访问过的,3号结点和7号结点分别搜索搭配4号和8号结点,路径为4 代码 B

莫浅子的博客 1万+

【数据结构】最短路径问题(BFS/DFS算法,Dijkstra算法,Floyd算法,Bellman-Ford算法)

BFS算法——严格层序的BFS 核心思路 原生广度优先遍历的特点本来就是由源点向外发散,我们通过对队列大小的暂存,可以实现严格的按层遍历,层数即路径长度。 适用场景 因为本算法将层数看作路径长度,所以这要求图的所有边要么无权、要么权值相等。 单源的;可以求到某一个点的最短路径,也可以求到所有点的最短路径。 代码实现 private void DFS(boolean[][] graph, int source) { int len = graph.length; int[] dist = new int

丧心病狂Loli控的博客 5447

算法——所有节点对的最短路径:Floyd-Warshall算法、Johnson算法

所有节点对的最短路径 前言 前面介绍了单源最短路径问题,本文是介绍所有节点对的最短路径问题,首先我们会想到用前面所介绍的知识来求解该问题,根据不同类型的图可以用一下几种方法求解: 1、  若无权重的图,则可以使用|V|次BFS,时间复杂度是O[V*(V+E)]; 2、  若为非负权重边的图,则可以使用|V|次Dijkstra算法,不同的优先队列实现得到不同的时间复杂度:①线性数组,O(V3

关注校招求职,微信号:job_campus 7014

VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

关于VSCode上搭建C/C++开发环境的内容,到这里就结束了,这里博主感叹一下,VSCode真的挺强大的,作为一个编辑器,可以通过和编译器链接成为开发环境,将环境配置好的话,在这上面写代码似乎也是个不错的选择。大家有任何疑问,欢迎在评论区中提出,本篇博客有任何问题和错误也欢迎来和博主讨论,真心希望能和大家一起进步。最后,如果本篇博客对你有帮助的话,能不能给博主一个三连啊!

2303_79329831的博客 8万+

基于Java+SpringBoot+Vue的中小企业设备管理系统的设计与开发(源码+lw+部署文档+讲解等)

💗博主介绍:✌新人博主,工作经验两年+、专注于Java、小程序技术领域和毕业项目实战✌💗🌟文末获取源码+数据库🌟

2301_76502068的博客 1382

LIO-SAM编译ubuntu20.04 Noetic

一、下载二、编译&&解决报错报错如下。

Kenneth666888的博客 689

文件上传漏洞攻击与防范方法

文件上传漏洞攻击与防范方法 文件上传漏洞简介: 文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。 文件上传漏洞危害: 上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者上传...

m0_38103658的博客 4万+

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 目录 解决问题 解决思路 解决方法 解决问题 安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 解决思路 发生未知错误。 解决方法 很可能是因为当前电脑下载的cuda版本不适合当前电脑GPU支持的cuda版本! 推荐文章:CV:Win1..

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 7523

由异常的测试眼图引发的深入思考

信号测试中出现“双眼皮”的眼图测试效果,可能的导致因素总结如下:PCB通道阻抗设计不匹配,负载端出现严重反射;发射端采用了不当的信号预处理;接收器均衡处理不当;通道串扰严重... 基于以上的假设,本文就逐一分析下这些因素到底是如何对正常的信号眼图造成影响的。

一只豌豆象的博客 3062

小卫星多普勒频偏MATLAB代码

多普勒频偏是由于发射机和接收机之间的相对运动而引起的频率变化。对于小卫星,由于其速度和高度的变化,多普勒频偏会变得更加明显。本文将探讨小卫星多普勒频偏的原理、影响因素以及补偿方法。多普勒频偏的原理当发射机和接收机之间存在相对运动时,接收到的信号频率会发生变化。这种频率变化称为多普勒频偏。其原理可以描述如下:设发射机和接收机之间的距离为 d,发射信号的频率为 f0,发射机和接收机的相对速度为 v。则接收到的信号频率 f 为:其中 c 为光速。

qq_59747472的博客 244

【C语言】一文带你拿捏分支和循环语句(一万字详细讲解)

if/switch语句、while/fo/do...while循环语句、goto语句详解

StackFrame 1233

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: css实现可控进度条动效
下一篇: LeetCode:字符串中的额外字符
神说要有光 ye
博客等级 码龄8年 463粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值