数据结构与算法之狄克斯特拉算法

183 阅读2分钟

求有向加权非负最短路线就可以用狄克斯特拉算法

前提条件就是,不能加负权,有向

原理:

(1) 找出最小权的节点。

(2) 检查该节点的接下来的所有未处理过的节点,将它们的权分别计算相加,比较得出当前权最小的节点。

(3) 重复这个过程,直到对图中的每个节点都这样做了。

(4) 计算最终路径。

image.png

比如计算乐谱到钢琴最短路径

首先处理乐谱得出

路径
乐谱 -> 黑胶唱片5
乐谱 -> 海报0

可以看到目前得到的最小权节点就是海报

再对海报节点进行处理

路径
乐谱 -> 黑胶唱片5
乐谱 -> 海报0
乐谱 -> 海报 -> 低音吉他30
乐谱 -> 海报 -> 架子鼓35

可以看到目前的未处理过的节点最小权是黑胶唱片

在对黑胶唱片进行处理

路径
乐谱 -> 黑胶唱片5
乐谱 -> 海报0
乐谱 -> 海报 -> 低音吉他30
乐谱 -> 海报 -> 架子鼓35
乐谱 -> 黑胶唱片 -> 低音吉他20
乐谱 -> 黑胶唱片 -> 架子鼓25

处理黑胶唱片发现,低音吉他和架子鼓的最小路径变成了,从黑胶唱片节点来的所以更新一下记录

路径
乐谱 -> 黑胶唱片5
乐谱 -> 海报0
乐谱 -> 黑胶唱片 -> 低音吉他20
乐谱 -> 黑胶唱片 -> 架子鼓25

现在未处理过的节点中 最小的权就是低音吉他

路径
乐谱 -> 黑胶唱片5
乐谱 -> 海报0
乐谱 -> 黑胶唱片 -> 低音吉他20
乐谱 -> 黑胶唱片 -> 架子鼓25
乐谱 -> 黑胶唱片 -> 低音吉他 -> 钢琴40

得到终点钢琴的权为40,但是还有节点未处理过,并且现在为最小权,所以还没有结束,继续处理架子鼓

路径
乐谱 -> 黑胶唱片5
乐谱 -> 海报0
乐谱 -> 黑胶唱片 -> 低音吉他20
乐谱 -> 黑胶唱片 -> 架子鼓25
乐谱 -> 黑胶唱片 -> 低音吉他 -> 钢琴40
乐谱 -> 黑胶唱片 -> 架子鼓 -> 钢琴35

得到 乐谱 -> 黑胶唱片 -> 架子鼓 -> 钢琴 的权更小 即更新记录

路径
乐谱 -> 黑胶唱片5
乐谱 -> 海报0
乐谱 -> 黑胶唱片 -> 低音吉他20
乐谱 -> 黑胶唱片 -> 架子鼓25
乐谱 -> 黑胶唱片 -> 架子鼓 -> 钢琴35

所以根据狄克斯特拉算法得到最小权为 35, 路径为乐谱 -> 黑胶唱片 -> 架子鼓 -> 钢琴