Dijkstra算法文档格式.docx
- 文档编号:17052694
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:11
- 大小:274.71KB
Dijkstra算法文档格式.docx
《Dijkstra算法文档格式.docx》由会员分享,可在线阅读,更多相关《Dijkstra算法文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
,
为弧
上的权值;
II)若不存在
为
;
Step2.选取一个最小的权值,加入到S中.
Step3.对其余T中点对应到初始点v0距离值修改,具体的修改为若加进点w,如果加入w之后,从v0到vi的距离有所减小,则用w到v0得知代替其余T中点对应到初始点v0距离值
重复步骤2,3,直到将所有的点,都经历一遍为止,即w=vi为止;
具体步骤的示意图如下图3.1所示:
图3.1迪杰斯特拉算法求最短路径的具体步骤
3.3迪杰斯特拉算法的可行性分析及实际应用分析
迪杰斯特拉算法的本质就是遍历一个图之中所有的点的一种最短路径算法[7],算法的思想是以其中的一个点为起点,向该点的外围扩散,直到将所有的点,都经历一遍为止,即w=vi为止;
因此算法必然会在有限步后终止,不会出现死循环。
所以,算法是可行的,也是正确的。
问题1:
已知如图3.2所示的单行线交通网,它是一个有向图,每条弧旁的数字表示这条单行线的长度.现在某人要从
出发,通过这个交通网到
去,求使下图中总路程最小的路径.
图3.2
引入基本变量:
ωij:
各边的权数,
d(v1,vj):
v1到vj的路的总权数的最小值
P标号:
从v1到vj的最短路径的权数已确定
T标号:
从v1到vj的最短路径的权数的上界
Si:
算法进行到第i步时,具P标号点的集合.
λ(v)=m:
从vs到v的最短路上,v的前一个点是vm,λ(v)=0,则v=vs.
λ(v)=M:
D中不含从vs到v的路;
下面我们结合图表演示Dijkstra算法的基本步骤和基本原理
我们用图表结全的方法讲述Dijkstra算法的基本步骤
第一步:
因ωij≥0,故d(v1,v1)=0.v1加上P标号(图3.3中用划圈表示).
图3.3
表3.1第一步
被圈去的次序
顶点
从v1到该点的最短路的长度
该节点的前一个节点
1
v1
起点
v2
v3
v4
v5
v6
v7
v8
v9
第二步:
从v1共发出3条弧,(v1,v2),(v1,v3),(v1,v4).
若从v1出发沿(v1,v2)到达v2,权数为d(v1,v1)+ω12=6;
若从v1出发沿(v1,v3)到达v3,权数为d(v1,v1)+ω13=3;
若从v1出发沿(v1,v4)到达v4,权数为d(v1,v1)+ω14=1.
min{d(v1,v1)+ω12,d(v1,v1)+ω13,d(v1,v1)+ω14}
=min{6,3,1}=d(v1,v1)+ω14=1
故从v1出发到v4的路径的最小权必为1,最短路是(v1,v4),d(v1,v4)=1,
图3.4
表3.2第二步
加P标号的次序
6
3
2
第三步:
加上红圈的点表示具有P标号,现考查从v1及v4指向其余点的弧
从v1出发,分别沿(v1,v2)、(v1,v3)到达v2,v3,权数分另别为6和3,
从v4出发,沿(v4,v6)到达v6,权数为d(v1,v4)+ω46=1+10=11,
min{d(v1,v1)+ω12,d(v1,v1)+ω13,d(v1,v4)+ω46}
=min{6,3,11}
=d(v1,v1)+ω13=3
故从v1到v3的最短路是(v1,v3),d(v1,v3)=3,
v3加上P标号.
图3.5
表3.3第3步
11
第四步:
加上红圈的点表示具有P标号,现考查从v1,v3和v4发出的弧.
从v1出发,沿(v1,v2)到达v2总权数为d(v1,v1)+ω12=6,
从v3出发,沿(v3,v2)到达v2总权数为d(v1,v3)+ω32=5,
5<
6,因此到达v2的路径长度的上界应改为5,v2的前一个节点也应改为v3.
从v3出发,沿(v3,v4)到达v4,因v4已具有P标号,不再参与计算.
从v4出发,沿(v4,v6)到达v6权数为d(v1,v4)+ω46=1+10=11,
min{d(v1,v1)+ω12,d(v1,v3)+ω32,d(v1,v4)+ω46}
=min{6,5,11}
=d(v1,v3)+ω13=5.
故从v1到v2的最短路是(v1,v3,v2),d(v1,v2)=5,v2加上P标号.
图3.6
表3.4第4步
4
6,5
v1
按照同样的方法,重复这个过程即可得到从v1出发到v8的最短路,最终的表格如下:
表3.5最终表格
5
7
11,10
v4
9
8
12
从表中我们可以到得从从v1出发到v8的最短路的长度为12,具体路短为:
v8←v5←v2←v3←v1.
我们基于Dijkstra算法的基本原理,应用C语言编写了计算机程序,代码如下:
#include<
stdio.h>
#defineMIN(x,y)(x<
=y?
x:
y)
voidmain()
{
doublea[10][10],v[10][3],t;
inti,j,k,n=9,m,i0,m0;
for(i=0;
i<
=n;
i++)
for(j=0;
j<
j++)
a[i][j]=-1;
=9;
=2;
v[i][j]=-1;
//邻接矩阵
a[1][2]=6;
a[1][3]=3;
a[1][4]=1;
a[2][5]=1;
a[3][2]=2;
a[3][4]=2;
a[4][6]=10;
a[5][4]=6;
a[5][6]=4;
a[5][7]=3;
a[5][8]=6;
a[6][5]=10;
a[6][7]=2;
a[7][8]=4;
a[9][8]=3;
a[9][5]=2;
//i0:
起点下标,m0:
终点下标;
puts("
Pleaseinputtheindexofthestaringpoint:
"
scanf("
%d"
&
i0);
Pleaseinputtheindexofterminalpoint:
"
m0);
i=i0;
m=m0;
n=9;
//点的总数
v[i][0]=0;
v[i][1]=1;
v[i][2]=0;
while
(1)
{
for(j=1;
{
if(v[j][1]>
0)continue;
t=a[i][j];
if(t<
0.0)continue;
t+=v[i][0];
if(v[j][0]<
0)
{
v[j][0]=t;
v[j][2]=i;
}
elseif(t<
v[j][0])
}
t=1.0e20;
if(v[j][1]>
0||v[j][0]<
0)continue;
t)
t=v[j][0];
k=j;
v[k][1]=1.0;
i=k;
if(k==m)break;
}
for(j=1;
printf("
%3d--%5.2f--%5.2f--%5.2f\n"
j,v[j][0],v[j][1],v[j][2]);
printf("
Theleastchainis:
%d"
m);
k=(int)(v[m0][2]);
<
--%d"
k);
m0=k;
if(k==i0)break;
}
运行程序,我们得到的结果,如图3.7所示,与我们表上作业方法所得的结果完全一致.
图3.7Dijkstra算法求解问题1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Dijkstra 算法