最短路问题实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

i
pk
p3 p2 p1
q1
q2
qm
j
算法步骤
Floyd 算法:求任意两点间的最短路.
D(i,j):i 到 j 的距离. R(i,j):i 到 j 之间的插入点. 输入: 带权邻接矩阵 w(i,j)
(1)赋初值:
对所有 i,j, d(i,j) w(i,j), r(i,j) j, k 1
(2) 更新 d(i,j), r(i,j)
9 12
12
最l(v后) 标记: z (v)
02
u1 u1
1
u1
u
7
6
u2 3 u5 6 u49 u152
l(ui )
u1 u2 u3 u4 u5 u6 u7 u8
最后标记:
l(v)
z (v)
02
u1 u1
17
u1 u6
3 u2
6 9 12
u5
u4
u5
u2
u5
u1
u4
u6
是从
vi 到
vj 的只允许以
v1

v2 作为中间点的路径中最短路的长度.


)D(
)=
(d
( ij
)
)
,其中 di(j )
min{d
( ij
1)
,
di(
1)
d(j 1)}
d
( ij
)
是从
vi

vj
的只允许以
v1、v2、…、
v
作为中间点的路径中最短路
的长度.即是从 vi 到 vj 中间可插入任何顶点的路径中最短路的长,因此
(2)更新 l(v) 、 z(v) : v S V \ S ,若 l(v) > l(u) W(u,v) 则令 l(v) = l(u) W(u,v) , z(v) = u
(3) 设 v * 是使 l(v) 取最小值的 S 中的顶点,则令 S=S∪{ v * }, u v*
(4) 若 S φ,转 2,否则,停止.
(1)D(1)=
(di(jቤተ መጻሕፍቲ ባይዱ) )
,其中
d (1) ij
min{di(j0)
,
d (0) i1
d (0) 1j
}
d
(1) ij
是从
vi

vj
的只允许以
v1
作为中间点的路径中最短路的长度.
(2)D(2)=
(di(j2) )
,其中
d (2) ij
min{di(j1)
,
d (1) i2
d
(1) 2j
}
d
(2) ij
D( )即是距离矩阵.
算法原理—— 求路径矩阵的方法
在建立距离矩阵的同时可建立路径矩阵R.
R= (rij ) , rij 的含义是从 vi 到 vj 的最短路要经过点号为 rij 的点.
R(0) (rij(0) ) ,
r (0) ij
j
每求得一个 D(k)时,按下列方式产生相应的新的 R(k)
r (k) ij
算法的过程就是在每一步改进这两个标记,使最终 l(v) 为从顶点
u0 到 v 的最短路的权. S:具有永久标号的顶点集
输入: G 的带权邻接矩阵 w(u, v)
算法步骤:
(1)赋初值:令 S={ u0 }, l(u0 ) =0 v S V \ S ,令 l(v) =W(u0 ,v) , z(v) = u0 u u0
u8
u3
u7
• w=[ ];
• function [l,z]=Dijkstra(W) n = size (W,1); for i = 1 :n l(i)=W(1,i); z(i)=1; end i=1; while i<=n for j =1 :n
• if l(i)>l(j)+W(j,i) l(i)=l(j)+W(j,i); z(i)=j; if j<i i=j-1; end
实验目的 实验内容
1、了解最短路的算法及其应用 2、会用Matlab软件求最短路
1、图 论 的 基 本 概 念
2、最 短 路 问 题 及 其 算 法
3、最 短 路 的 应 用 4、实验作业
固定起点的最短路
最短路是一条路径,且最短路的任一段也是最短路. 假设在u0-v0的最短路中只取一条,则从u0到其 余顶点的最短路将构成一棵以u0为根的树.
然后用同样的方法再分头查找.若:
(1)向点
i
追朔得:
r ( ip1
)
p2
,
r ( ip2
)
p3
,…,
r ( ipk
)
pk
(2)向点
j
追朔得:
r ( ) p1 j
q1
,
r ( ) q1 j
q2
,…,
r ( qm
) j
j
则由点i到j的最短路的路径为: i, pk , , p2, p1,q1, q2, , qm , j
end end i=i+1; end
floyd算法的基本思想
直接在图的带权邻接矩阵中用插入顶点的方法
依次构造出 个矩阵 D(1)、 D(2)、… 、D( ),使最 后得到的矩阵 D( )成为图的距离矩阵,同时也求出
插入点矩阵以便得到两点间的最短路径.
算法原理—— 求距离矩阵的方法
把带权邻接矩阵 W 作为距离矩阵的初值,即 D(0)= (di(j0) ) =W
用上述算法求出的 l(v) 就是 u0 到 v 的最短路的权,从 v 的父亲标记 z(v) 追溯到 u0 , 就得到 u0 到 v 的最短路的路线.
例 求下图从顶点 u1 到其余顶点的最短路.
先写出带权邻接矩阵:
0
2 0
1
8 6
1
0
7
9
W
0 5 1 2 0 3 9
0 4 6
对所有 i,j,若 d(i,k)+d(k,j)<d(i,j),则 d(i,j) d(i,k)+d(k,j), r(i,j) k
0
3 0
因 G 是无向图,故 W 是对称阵.
迭代 次数
1 2 3 4 5 6 7 8
l(ui )
u1 u2 u3 u4 u5 u6 u7 u8

0 2 1 8
2
8
10
8
3
10
8
6 10 12
7 10 12
k rij(k 1)
若d
(k ij
1)
d (k 1) ik
d
(k kj
1)
否则
即当vk被插入任何两点间的最短 路径时,被记录在R(k)中,依次 求D( )时求得R( ) ,可由R( )来查找 任何点对之间最短路的路径.
算法原理—— 查找最短路路径的方法
若 rij( ) p1,则点 p1 是点 i 到点 j 的最短路的中间点.
因此, 可采用树生长的过程来求指定顶点到其余顶点 的最短路.
Dijkstra 算法:求 G 中从顶点 u0 到其余顶点的最短路 设 G 为赋权有向图或无向图,G 边上的权均非负.
对每个顶点,定义两个标记( l(v) , z(v) ),其中: l(v) :表从顶点 u0 到 v 的一条路的权. z(v) :v 的父亲点,用以确定最短路的路线
相关文档
最新文档