最短路问题就是求 【一个点到另一个点的最短路径】
分为单源最短路(一个点到各个点之间的距离)和多源最短路(任意两点之间的距离)
1.Dijkstra算法
- 使用广度优先搜索,解决【赋权有向图】或【无向图的单源最短路径】问题,不能出现负边
- 基于【贪心】思想
1.1 内容
// 用 d i s [ ] dis[] dis[]数组储存从顶点到其他点的路径,通过一步步遍历比较,不断更新(保留最小的,改变较大的),最后得到dis即为所求
求从v1到各个点的最短路:
step1:初始化dis
step2:找最小的,固定,从这个点往外遍历
此时,离起点最近的那个点一定是最短的,因为没有负边,不可能经过其他的点了
① v3最小,意思是从v1到v3的所有路径中,一定是现在的最短,所以把<v1,v3>确定下来了
② 从v3开始遍历,发现v4,v4没有被遍历过,比较<v1,v3,v4>(经过v3到达)和<v1,v4>(由顶点直接到达)的最短距离(松弛操作),更新v4
step3:找最小的,固定
(重复step2中的思想往下做就行啦)
不断取出离顶点最近,并且没有被访问过的点
① v5最小,固定
② 遍历v5,发现<v5,v4>和<v5,v6>,比较<v1,v5,v4><v1,v4>和<v1,v5,v6><v1,v6>(顶点直接到达的和经过v5到达的)更新
step4:v4最小,固定,遍历v4发现v6,比较<v1,v6>和<v1,v4,v6><v1,v5,v6>,更新
1.2 堆优化
时间复杂度为