带权图单源最短路径求解——Dijkstra算法及实现
算法思想及数据结构
Dijkstra是一种基于贪心策略的算法实现,追求局部最优进而求解全局最优。
以下的流程,所给的带权图将以邻接矩阵arcs[][]的形式存储,arcs[i][j]表示有向边的权值,若两结点间无直接的边相连,则距离表示为-1(即用-1来表示不可达)。
除举证arsc int[][]外,还需构造三个辅助数组:
- final []bool
标记各点是否已经找到最短路径
- dust []int
记录当前各点到源的最小距离
- path []int
记录到达各点的最短路径的目标点的前一个点的下标,通过path[]就能够还原出最短路径
算法流程
初始化dust,设源点为x,dist[]=arcs[x][],这表示与源直接连接的点的距离。
遍历dist[],找到min(dist[i]),修改final[i]=true,path[i]=0(排除final[i]=true,和dist[i]=-1的值)
遍历arcs[i][],若存在dist[j]>dist[i]+arsc[i][j](-1视为无限大),修改dist[j]=dist[i]+arsc[i][j],path[j]=i
重复二、三步,至多n-1次后算法结束。
算法复杂度
使用邻接矩阵存储的情况下,由于最坏的情况下需要遍历n遍,因此时间复杂度为 $O(|V|^2)$
代码实现
1 |
|
测试所用用例如下:
带权图单源最短路径求解——Dijkstra算法及实现
https://1303-yzym.github.io/2024/09/23/带权图单源最短路径求解——Dijkstra算法及实现/