迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
Dijkstra算法每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。
算法的基本思想:
- 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
- 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
- 初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。
3.1. 然后,从U中找出路径最短的顶点k,并将其加入到S中;
3.2. 接着,利用3.1中选出的顶点k更新U中的顶点和顶点对应的路径,例如(s,v)的距离可能大于(s,k)+(k,v)的距离;
3.3. 重复3.1~3.2操作,直到遍历完所有顶点。
使用邻接矩阵实现的时间复杂度为$O(V^2)$,使用邻接表实现的复杂度为$O(E+V)\log{V}$
缺点:Dijkstra算法求最短路径的图是不能有负权边的,因为扩展到负权边的时候会产生更短的路程,有可能就破坏了已经更新的点路程不会改变的性质。
|
|
结果为:10 2 5 4