最短路径算法dijkstra

最短路径算法dijkstra

该算法的核心就是从当前节点的邻居节点中找到距离起始节点的最近那个节点,作为下步迭代的节点。

一 算法步骤

  1. 给定起始节点s(v0)s(v_0)、邻接矩阵AA
  2. 初始化nn维零标记向量labellabelnninfinf距离向量distancedistance
  3. s(v0)s(v_0)开始,更新label[0]=1label[0] = 1distance[0]=1distance[0] = 1
  4. 遍历搜索,更新labellabeldistancedistance,记当前搜索节点viv_i,如果label[j]!=1A[i,j]+distance[i]<distince[j]label[j] != 1且A[i,j] + distance[i] < distince[j],更新distince[j]=A[i,j]+distance[i]distince[j] = A[i,j] + distance[i]jmin(A[i,j]+distance[i])j 为 min(A[i,j] + distance[i])时的下次搜索节点,更新label[j]=1label[j] = 1

二 例子

  1. 邻接矩阵A
v0 v1 v2 v3 v4 v5
v0 0 1 12 inf inf inf
v1 inf 0 9 3 inf inf
v2 inf inf 0 inf 5 inf
v3 inf inf 4 0 13 15
v4 inf inf inf inf 0 4
v5 inf inf inf inf inf 0
  1. 示例图
    最短路径算法dijkstra
  2. 过程

3.1 v0v_0AA;
3.2 标记向量label=[0,0,0,0,0,0]label = [0, 0, 0, 0, 0, 0]
距离向量distance=[inf,inf,inf,inf,inf,inf]distance = [inf, inf, inf, inf, inf, inf]
3.3 v0v_0开始,所以更新
label=[1,0,0,0,0,0]label = [1, 0, 0, 0, 0, 0]
distance=[0,inf,inf,inf,inf,inf]distance = [0, inf, inf, inf, inf, inf]
3.4 更新labeldistancelabel、distance
因为label[1]!=1A[0,1]+distance[0]<distince[1]label[1] != 1且A[0,1] + distance[0] < distince[1],所以更新distince[1]=1distince[1] = 1
因为label[1]!=1A[0,2]+distance[0]<distince[2]label[1] != 1且A[0,2] + distance[0] < distince[2],所以更新distince[2]=12distince[2] = 12
1min(A[i,j]+distance[i])1 为 min(A[i,j] + distance[i])时的下次搜索节点v1v_1
此时
label=[1,1,0,0,0,0]label = [1, 1, 0, 0, 0, 0]
distance=[0,1,12,inf,inf,inf]distance = [0, 1, 12, inf, inf, inf]
最终得到distance=[0,1,8,4,13,17]distance = [0, 1, 8,4,13, 17]