求某个源点到其余各顶点的最短路径。
顶点集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