致读者

致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。尽管当前水平可能不及各位大佬,但我会尽我自己所能,做到最好☺。——天地有正气,杂然赋流形。下则为河岳,上则为日星。

前言

最短路其实一开始我也不会,感觉,这都是什么啊,好复杂。????

????然后自己给自己制造心理负担。

然后经过若干次的逛B站终于找到一个大佬,灯神!!!!

然后我我终于弄懂了最短路,呜呜~~<(_ _)>。

然后又是几个小时的疯狂debug!!!然后发现最后的错误竟然的数组初始化??!!!

难道我把基础给丢了??

别说了,我已经哭晕在厕所????

最后…又是若干次coding,终于!!!

{% note success %}
success ????幸运女神的偏爱让我受宠若惊????
{% endnote %}

上面的是几个小时的心情????,我现在真开心,画了两个小时的图,然后。。。

我还能说点啥,,

用优先队列实现最短路

虽然换个软件大部分数据都没有丢但是!!!!

我现在心情比较复杂????

用优先队列实现最短路

正文

build图

俗话说得好,先画图????

那么我们就塑造一个图形????来人,上图????

用优先队列实现最短路

因为是另外一个软件转换的,这个画质,,,我枯辽。????
看看这样精美的图,可惜了我丢失的数据!!!!啊啊啊啊,谁能告诉我别的画图软件!!

这肯定是魔化的最短路径算法,这里呢,我们用到了一种特殊的数据结构 优先队列

用优先队列实现最短路

名字 备注
parents 储存当前结点的父亲
weight 表示起点到达该点所需要的权值
优先队列 一种数据结构,这个地方每次都取权值最小的一个点

这个地方我们的起点是A终点是F

首先我们起点先入队。

然后此时A结点的父亲就是自己。

权值为0;

用优先队列实现最短路

首先我们先从队列中取出一个元素。也就是队首元素

用优先队列实现最短路

然后找到与之相邻的边,而且边上的另一个顶点没有被访问过。

用优先队列实现最短路

这个时候我们发现与A相连的顶点且没有被访问的是B AND C

到B 的距离是5, 到C的距离是1

这个时候我们其实可以发现 B 是由 A 点经过的。也就是 A - > B 所以 B的父亲是A,距离就是A->B的距离 + A的权值 0.

用优先队列实现最短路
这个时候A点已经被访问过啦,所以我们要把A点标记或者去除

用优先队列实现最短路

然后继续取出优先队列队首的元素

用优先队列实现最短路

找到与C相邻但是没有别访问的顶点

用优先队列实现最短路

这个时候一定要注意B这个点

用优先队列实现最短路

具体分析:我们会发现,我们第一次标记B的时候,也就是A->B的权值是5,但是对于顶点C也能够访问到B点,权值就是C的权值加上C->B的权值。这个地方就等价于A->C->B = 3,权值更小,这说明对于起点A来说,到达B的路径中,存在着一条更短的路径,权值为3,所以我们要更新weight[C],同时我们会发现,C访问的B,那不就是说,B的父亲是C吗,所以我们需要更新这两个。

用优先队列实现最短路

对于顶点D AND E来说,那就比较简单了。

直接添加父亲结点。

添加权值信息。

用优先队列实现最短路

注意 :这个时候我们需要把刚刚的BDE三个点和附带的权值信息重新添加进入优先队列。

这个时候,因为是优先队列,所以会按照权值大小顺序,自动排序。

同时因为C点已经访问了,所以一定要标记。

用优先队列实现最短路

继续从队列中获取结点B

用优先队列实现最短路
找到B相连接的没有被访问的结点。更新权值信息。
用优先队列实现最短路

用优先队列实现最短路

具体分析:我们会发现,我们第一次标记D的时候,也就是C->D的权值是5,但是对于顶点B也能够访问到D点,权值就是B的权值加上B->D的权值。这个地方就等价于A->C->B->D = 4,权值更小,这说明对于起点A来说,到达D的路径中,存在着一条更短的路径,权值为4,所以我们要更新weight[D],同时我们会发现,B访问的D,那不就是说,D的父亲是B吗,所以我们需要更新这两个。

不要忘记把对应的 (D, 4)重新放回优先队列。
用优先队列实现最短路
取出结点D。
用优先队列实现最短路

更新对应的E AND F点的信息

用优先队列实现最短路

用优先队列实现最短路
标记D点,同时把(E,7)(F,10)入队

用优先队列实现最短路
重点来了!!!!!!!此时我们出队的话,会发现,队首是B。

但是B已经被访问过了,所以出队直接丢弃,同理D也是如此,E和F已经不能访问到任何其它顶点,所以到这个地方,都是出队的操作了。但是方法还跟上面一样,唯一需要记得的就是B点的情况,出队的顶点已经被访问,直接丢弃。

因为软件崩溃数据丢失,上面的是另一个软件转换的。所以不在展示。

路径问题

已经找到最短路径了,该怎么求得路径呢?

用优先队列实现最短路

我们知道结束的点是 F

F 的父亲是 D

D 的父亲是 B

B 的父亲是 C

C 的父亲是 A

所以我们可以发现答案是 A -> C -> B -> D -> F

最短路径是 10

用优先队列实现最短路

后记

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括:
确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。
确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。
全局最短路径问题 - 求图中所有的最短路径。适合使用Floyd-Warshall算法。

难受,相当难受,软件崩溃,还好修复回来了部分数据,太难受了,差点所有的数据都丢失????.如果觉得有帮助,可以给我一个小心心吗。????

相关文章:

  • 2021-12-08
  • 2022-12-23
  • 2022-02-23
  • 2021-09-01
  • 2021-08-07
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-11
  • 2022-12-23
  • 2021-04-26
  • 2022-02-26
  • 2022-12-23
  • 2021-09-02
相关资源
相似解决方案