数据结构之图(最短路径问题)

求最短路径

问题描述

两种
单源最短路径问题和每队顶点的最短路径问题
在这里插入图片描述
对应图有不同的解法

BFS算法

求不带权图最短路径
在这里插入图片描述
原来的BFS算法
在这里插入图片描述
改进求最短路径的
在这里插入图片描述
就是多加d[]数组和path[]数组
d[]数组来记录从顶点到对应节点路径长
path[]数组记录每个对应节点的直接前驱节点
比如3对应的就是6奥
如果是按节点大小顺序入队的话
4前驱节点应该是3
如果不是的话可能是7
看情况
看先处理谁了
在这里插入图片描述

Dijkstra算法

BFS算法的局限
在这里插入图片描述
不能算带权图最短路径

算法
在这里插入图片描述
定义三个数组
第一个数组代表是否找到到其最短路径
第二个数组代表目前为止从初始顶点到对应顶点最短路径的长度
第三个路径上的前驱
第一轮
在这里插入图片描述
先遍历跟节点v0进行一个初始的dist[]和path[]的数据更新

数据更新完以后,找对应dist[]最小且final[]不为false的节点Vi,再把final[i]=true
(分析一波:为什么找到dist最小的直接等于true,首先从根节点只有两条路一个v1一个v4这里dist[4]是5比10小,路径长度肯定是相对于v0而言的,所以如果你从别的方式到达v4肯定要经过v1,那就肯定比v1直接到v4大,所以肯定v4的最短路径就出来了,但是v1就不确定,到v1你处理可以从v0直接到v1还可以经过v4(虽然后面不知道)但是是有可能比10小的,所以final[v4]就直接为true)
再通过这个节点遍历其旁边final[]为false的节点进行dist[]和path[]的更新
最后把要所有节点遍历一遍,final[]全是true

dist[]如果找到比原数值小的数
的话
替换对应的dist[]和path[]
注意奥dist和path[]是一起变的,没有说只有一个变
在这里插入图片描述
第二轮还是,找遍历dist数组找dist[]最小且final[]不为false的节点Vi,作为下一个节点
且定义这个绩点为true(和前面的分析一样的奥,就是初始顶点变了,不过最后还是从v0到对应顶点的距离)
然后遍历其旁边的边(节点)更新dist和path数组
第三四五轮一样
在这里插入图片描述
算法完成后的数组
在这里插入图片描述

代码实现

在这里插入图片描述
在这里插入图片描述

负权值失效

在这里插入图片描述

Floyd算法

各点间的最短路径问题!
原理
在这里插入图片描述
直接举例吧
第一遍不允许有中转顶点的情况
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
就由最后一个推出来的矩阵就能确定
某点到某点的最短路径喽
通过path来判断路径
对应的0 1 2代表v0 v1 v2做中转点
在这里插入图片描述

代码实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
练习
在这里插入图片描述

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值