最短路径算法dijkstra

最短路径算法dijkstra

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

一 算法步骤

  1. 给定起始节点 s ( v 0 ) s(v_0) s(v0)、邻接矩阵 A A A[定义待补充]
  2. 初始化 n n n维零标记向量 l a b e l label label n n n i n f inf inf距离向量 d i s t a n c e distance distance
  3. s ( v 0 ) s(v_0) s(v0)开始,更新 l a b e l [ 0 ] = 1 label[0] = 1 label[0]=1 d i s t a n c e [ 0 ] = 0 distance[0] = 0 distance[0]=0
  4. 遍历搜索,更新 l a b e l label label d i s t a n c e distance distance,记当前搜索节点 v i v_i vi,如果 l a b e l [ j ] ! = 1 且 A [ i , j ] + d i s t a n c e [ i ] < d i s t i n c e [ j ] label[j] != 1且A[i,j] + distance[i] < distince[j] label[j]!=1A[i,j]+distance[i]<distince[j],更新 d i s t i n c e [ j ] = A [ i , j ] + d i s t a n c e [ i ] distince[j] = A[i,j] + distance[i] distince[j]=A[i,j]+distance[i] j 为 m i n ( A [ i , j ] + d i s t a n c e [ i ] ) j 为 min(A[i,j] + distance[i]) jmin(A[i,j]+distance[i])时的下次搜索节点,更新 l a b e l [ j ] = 1 label[j] = 1 label[j]=1

二 例子

  1. 邻接矩阵A
v0v1v2v3v4v5
v00112infinfinf
v1inf093infinf
v2infinf0inf5inf
v3infinf401315
v4infinfinfinf04
v5infinfinfinfinf0
  1. 示例图
    初始图示例
  2. 过程

3.1 v 0 v_0 v0 A A A;
3.2 标记向量 l a b e l = [ 0 , 0 , 0 , 0 , 0 , 0 ] label = [0, 0, 0, 0, 0, 0] label=[0,0,0,0,0,0]
距离向量 d i s t a n c e = [ i n f , i n f , i n f , i n f , i n f , i n f ] distance = [inf, inf, inf, inf, inf, inf] distance=[inf,inf,inf,inf,inf,inf]
3.3 v 0 v_0 v0开始,所以更新
l a b e l = [ 1 , 0 , 0 , 0 , 0 , 0 ] label = [1, 0, 0, 0, 0, 0] label=[1,0,0,0,0,0]
d i s t a n c e = [ 0 , i n f , i n f , i n f , i n f , i n f ] distance = [0, inf, inf, inf, inf, inf] distance=[0,inf,inf,inf,inf,inf]
3.4 更新 l a b e l 、 d i s t a n c e label、distance labeldistance
因为 l a b e l [ 1 ] ! = 1 且 A [ 0 , 1 ] + d i s t a n c e [ 0 ] < d i s t i n c e [ 1 ] label[1] != 1且A[0,1] + distance[0] < distince[1] label[1]!=1A[0,1]+distance[0]<distince[1],所以更新 d i s t i n c e [ 1 ] = 1 distince[1] = 1 distince[1]=1
因为 l a b e l [ 1 ] ! = 1 且 A [ 0 , 2 ] + d i s t a n c e [ 0 ] < d i s t i n c e [ 2 ] label[1] != 1且A[0,2] + distance[0] < distince[2] label[1]!=1A[0,2]+distance[0]<distince[2],所以更新 d i s t i n c e [ 2 ] = 12 distince[2] = 12 distince[2]=12
1 为 m i n ( A [ i , j ] + d i s t a n c e [ i ] ) 1 为 min(A[i,j] + distance[i]) 1min(A[i,j]+distance[i])时的下次搜索节点 v 1 v_1 v1
此时
l a b e l = [ 1 , 1 , 0 , 0 , 0 , 0 ] label = [1, 1, 0, 0, 0, 0] label=[1,1,0,0,0,0]
d i s t a n c e = [ 0 , 1 , 12 , i n f , i n f , i n f ] distance = [0, 1, 12, inf, inf, inf] distance=[0,1,12,inf,inf,inf]
最终得到 d i s t a n c e = [ 0 , 1 , 8 , 4 , 13 , 17 ] distance = [0, 1, 8,4,13, 17] distance=[0,1,8,4,13,17]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值