致读者
致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。尽管当前水平可能不及各位大佬,但我会尽我自己所能,做到最好☺。——天地有正气,杂然赋流形。下则为河岳,上则为日星。
前言
最短路其实一开始我也不会,感觉,这都是什么啊,好复杂。????
????然后自己给自己制造心理负担。
然后经过若干次的逛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算法。
难受,相当难受,软件崩溃,还好修复回来了部分数据,太难受了,差点所有的数据都丢失????.如果觉得有帮助,可以给我一个小心心吗。????