## 最短路dijkstra模板
dijkstra
算法总结- 常用模板解决
- 其他写法
题目链接
题目
dijkstra
算法总结
总结一下dijkstra
算法大致的流程:
- 一开始有一个
dist[]
数组(也可以是map
)来保存从start
(起点)到每个点的最短路径(一开始的话,如果start
和某个点没有边,就为INF
(或者为null
),如果有连线的话就是边的权值); - 然后每次从
dist
数组中取出一个dist[i]
最小的i
(不能取已经用过的顶点(vis
数组标记)),也就是start距离某个结点最近的一个; - 取出这个结点之后,用这个结点更新和它相连的边的
dist
数组; - 直到把所有的
dist
数组都更新一遍;
注意:
dijkstra
为什么不能有负权边? 因为如果有的话,我们找最小的那个结构的时候,没准它还能通过松弛变得更短,例如上面我们一开始选出0~2
这条边的时候,试想如果2~1
的那条边权值为-4
,那一开始我们找的0~2
这条边就是错的,所以不能有负权边。
常用模板解决
推荐的写法
1 | import java.io.BufferedInputStream; |
其他写法
没有使用堆优化,也就是说找出当前最小的dist
所在的结构的时候,遍历了一遍当前的dist
。
1 | import java.io.BufferedInputStream; |
堆优化,其他写法(建图稍有不同):
1 | import java.io.BufferedInputStream; |
手写堆解决写法。
1 | import java.io.BufferedInputStream; |