单源最短路径(迪杰斯特拉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的当前最短路径的前驱顶点的下标。初始

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

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

例子:

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

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

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

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/qq_22238021/article/details/79493136
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞