Dijkstra
Contents
Dijkstra 算法详解
最短路径问题(Shortest Path)是图论研究中经典问题之一,目的是寻找图中两个节点之间最短路径。求解这类问题经典算法有Dijsktra算法、Floyd算法、A*算法等。其中Dijsktra算法最早也最经典。
Dijsktra算法是一种具有贪心思想的动态规划算法。每一步计算都会选择当前最优秀解并更新状态,直到最终状态。Dijsktra算法满足贪心算法基本思想,具有最优子结构性质,因此求出的最短路径序列的子序列也是最短路径,能够保证得到的解是全局最优解。
算法流程
Dijsktra算法可以计算赋权有向无环图中任意节点到其他节点的最短路径。
输入:赋权有向图 G=(V,E,W),其中V表示图中节点,E表示节点之间的边,W表示权值的集合,即两个节点间距离。起点s 和终点d。
输出:起点s 和终点d的最短路径
算法引入记录中间过程的数组:
- visited 记录已经访问过的节点,避免重复访问
- distance 记录当前所有顶点到s的距离
- parent 记录每个已经求出最短路径的节点的父节点
算法流程如下:
- 初始化数组,visited记录起点为1,其余节点都为0. distance记录每个节点到s的距离。
- 在未被访问过的节点中,找到距离s最近的节点u,在visited中标记。
- 遍历其他节点,如果某节点v到u的距离加上u到s距离之和比distance中记录的距离更小,在distance中更新节点v到s的距离。同时更新parent中v的父节点为u,表示这条路径是s-u-v
- 重复2,3步骤。直到遍历完所有节点。再查找(s,d)即可得到最短路径和对应距离
Dijsktra算法时间复杂度$O(n^2)$