单源最短路径(迪杰斯特拉Dijkstra算法)

求某个源点到其余各顶点的最短路径。

顶点集V分为子集S和子集V-S。

S:包含已确定最短路径的顶点(初始只含源点v)

V-S:包含尚未确定最短路径的顶点(初始含除v外的其他顶点)

数组dist,dist[i]:当前找到的从源点v到vi的“当前最短路径”。初值,v到vi的边的权值(无边为无穷大)

在V-S中选从源点到该顶点具有“当前最短路径长度”最小的vk加入S。从V-S中删除顶点vk。

vk加入S,V-S中顶点vj的“当前最短路径长度”dist[j]若小于dist[k]+w[k][j]则修改为该值。源点到vj的“当前最短路径”要么是源点直达vj,要么是只经过S中一个或多个顶点后再到达vj。

算法描述:

1、邻接矩阵表示带权图,初始S={v},设源点v对应下标为i,dist[i]=0,dist[j]=w[i][j]

2、选vk,使得dist[k]=min{dist[j]|vj属于V-S},S=S并{vk}

3、修改dist[u],u属于V-S,u不等于k

若dist[k]+w[k][u]<dist[u],则dist[u]=dist[k]+w[k][u]

调整path[u]=k

4、重复2和3共n-1次。求得源点v到其余各顶点的最短路径

算法实现:

数组S[MaxSize],S[j]=0顶点vj尚未求得最短路径,S[j]=1已求得

数组path[],path[j]保存到达顶点vj的当前最短路径的前驱顶点的下标。初始


通过path[j],path[path[j]],........,可反向跟踪由源点vi到各顶点vj的最短路径所经过的顶点

例子:



path[5]=3,v0到v5最短路径中前驱是v3,path[3]=4,v0到v3前驱是v4,path[4]=0,v0到v4前驱是v0,故v0到v5最短路径为v0,v4,v3,v5

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值