求有向加权非负最短路线就可以用狄克斯特拉算法
前提条件就是,不能加负权,有向
原理:
(1) 找出最小权的节点。
(2) 检查该节点的接下来的所有未处理过的节点,将它们的权分别计算相加,比较得出当前权最小的节点。
(3) 重复这个过程,直到对图中的每个节点都这样做了。
(4) 计算最终路径。
比如计算乐谱到钢琴最短路径
首先处理乐谱得出
| 路径 | 权 |
|---|---|
| 乐谱 -> 黑胶唱片 | 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, 路径为乐谱 -> 黑胶唱片 -> 架子鼓 -> 钢琴