急求dijkstra算法的程序

急求dijkstra算法的程序,第1张

算法基本思想

 设S为最短距离已确定的顶点集(看作红点集),V-S是最短距离尚未确定的顶点集(看作蓝点集)。

①初始化

 初始化时,只有源点s的最短距离是已知的(SD(s)=0),故红点集S={s},蓝点集为空。

②重复以下工作,按路径长度递增次序产生各顶点最短路径

 在当前蓝点集中选择一个最短距离最小的蓝点来扩充红点集,以保证算法按路径长度递增的次序产生各顶点的最短路径。

 当蓝点集中仅剩下最短距离为∞的蓝点,或者所有蓝点已扩充到红点集时,s到所有顶点的最短路径就求出来了。

注意:

 ①若从源点到蓝点的路径不存在,则可假设该蓝点的最短路径是一条长度为无穷大的虚拟路径。

 ②从源点s到终点v的最短路径简称为v的最短路径;s到v的最短路径长度简称为v的最短距离,并记为SD(v)。

(3)在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集

 根据按长度递增序产生最短路径的思想,当前最短距离最小的蓝点k的最短路径是:

 源点,红点1,红点2,…,红点n,蓝点k

距离为:源点到红点n最短距离+<红点n,蓝点k>边长

 为求解方便,设置一个向量D[0..n-1],对于每个蓝点v∈

V-S,用D[v]记录从源点s到达v且除v外中间不经过任何蓝点(若有中间点,则必为红点)的"最短"路径长度(简称估计距离)。

 若k是蓝点集中估计距离最小的顶点,则k的估计距离就是最短距离,即若D[k]=min{D[i]

i∈V-S},则D[k]=SD(k)。

 初始时,每个蓝点v的D[c]值应为权w<s,v>,且从s到v的路径上没有中间点,因为该路径仅含一条边<s,v>。

注意:

 在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集是Dijkstra算法的关键

(4)k扩充红点集s后,蓝点集估计距离的修改

 将k扩充到红点后,剩余蓝点集的估计距离可能由于增加了新红点k而减小,此时必须调整相应蓝点的估计距离。

 对于任意的蓝点j,若k由蓝变红后使D[j]变小,则必定是由于存在一条从s到j且包含新红点k的更短路径:P=<s,…,k,j>。且D[j]减小的新路径P只可能是由于路径<s,…,k>和边<k,j>组成。

 所以,当length(P)=D[k]+w<k,j>小于D[j]时,应该用P的长度来修改D[j]的值。

(5)Dijkstra算法

Dijkstra(G,D,s){

//用Dijkstra算法求有向网G的源点s到各顶点的最短路径长度

//以下是初始化 *** 作

S={s};D[s]=0;

//设置初始的红点集及最短距离

for(

all

i∈

V-S

)do

//对蓝点集中每个顶点i

D[i]=G[s][i];

//设置i初始的估计距离为w<s,i>

//以下是扩充红点集

for(i=0i<n-1i++)do{//最多扩充n-1个蓝点到红点集

D[k]=min{D[i]:all

i

V-S};

//在当前蓝点集中选估计距离最小的顶点k

if(D[k]等于∞)

return;

//蓝点集中所有蓝点的估计距离均为∞时,

//表示这些顶点的最短路径不存在。

S=S∪{k};

//将蓝点k涂红后扩充到红点集

for(

all

j∈V-S

)do

//调整剩余蓝点的估计距离

if(D[j]>D[k]+G[k][j])

//新红点k使原D[j]值变小时,用新路径的长度修改D[j],

//使j离s更近。

D[j]=D[k]+G[k][j];

}

}

Dijkstra算法设置一个集合S记录已求得的最短路径的顶点,初始时把源点v0放入S,集合S每并入一个新顶点vi,都要修改源点v0到集合V-S中顶点当前的最短路径长度值。

本例基于邻接矩阵存储的图。

在构造的过程中要设置三个辅助数组:

假设从顶点0出发,即v0=0,集合S最初只包含顶点0,邻接矩阵 edge[][] 表示带权有向图, edge[i][j] 表示有向边<i,j>的权值,若不存在有向边<i,j>,则 edge[i][j] 为∞。

Dijkstra算法的步骤如下:

顶点数:5,弧数:10

顶点编号:A B C D E

邻接矩阵:

参考结果:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11810265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存