第2讲最短路问题PPT教案
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 0
1 3 3,
3 0 5
2 4 1 3 5 0
插入点 v1,得: di(jk ) min{di(jk1) , di(kk 1) dk(jk 1)},
0 1 2
1
0
4 3
1 2 3 4 5 6
1
2
3
4
5
1
D (1)
4
0 2
2 0
3
1 3,
1
R (1)
1
2 2
第2页/共37页
二、Dijkstra算法
算法思想: 按距离u0由近及远为顺序,依次求得 u0到G的各顶点的最短路和距离,直至 所有顶点,算法结束。
第3页/共37页
Dijkstra算法: 求G中从顶点u0到其余顶点的最短路.
1) 置l(u0) 0,对v u0 ,l(v) ,S0 {u0} i 0 且 2) 对每. 个 v Si ,用 min{l(v),l(ui ) w(ui,v)}
于是,D( ) (di(j )) 中元素di(j )就是从vi到v j 的路径中间可 插入任何顶点的路径中最短路的长度,即D( )就是所求距离矩阵.
第19页/共37页
(II)求路径矩阵的方法.
在建立距离矩阵的同时可建立路径矩阵R.
设 R(k) (ri(jk) ) ,这里ri(jk)的含义是从vi到v j 的最短
第2讲最短路问题
会计学
1
定义 1) 若H是赋权图G的一个子图,则称H的各
边的权和 w(H ) w(e) 为H的权. 类似地,若
eE(H )
若P(u,v)是赋权图G中从u到v的路,称 w(P) w(e)
称为路P的权.
eE ( P )
2) 在赋权图G中,从顶点u到顶点v的具有最小权 的路P*(u,v),称为u到v的最短路.
(2) 更新 d(i,j), r(i,j): 对所有 i,j,若 d(i,k)+d(k,j)<d(i,j),
则
d(i,j)d(i,k)+d(k,j), r(i,j)k
(3) 若 k= ,停止.否则 kk+1,转(2).
第22页/共37页
例 求下图中加权图的任意两点间的距离与路径.
0 1 2
第18页/共37页
(I)求距离矩阵的方法. 设赋权图G的顶点集为V {v1,v2,,v }.
1) 写出赋权图G的带权邻接矩阵W ,把它作为距离矩阵的 初值,即 D(0) (di(j0) ) (wij ) W.
2)对k 1,2,, ,计算
D(k) (di(jk) ) , 其中di(jk ) min{di(jk 1) , di(kk 1) dk(jk 1)}, di(jk)表示从vi到v j 且中间点仅为v1,v2,,vk 的k 个点的所有 路径中的最短路的长度。
算法步骤:
1) 赋初值:令 S={u0}, l(u0)=0, v S V \ S , 令l(v)=W (u0,v), z(v)=u0,
u0 l(u)
u u0
l(v) v
w(u,v)
u
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
然后用同样的方法再分头查找.若: (1) 向点vi追朔得:ri(a1) a2,ri(a2) a3,…,ri(ak) ak . (2) 向点v j 追朔得:ra(1j) b1,rb(1j) b2,…,rb(m )j j .
则由点vi到v j 的最短路的路径为: vi ,vak ,,va2 ,va1,vb1,vb2 ,,vbm ,v j .
vi vak
va3
va2 va1 vb1
vb2
vbm v j
第21页/共37页
(IV)Floyd算法:求任意两顶点间的最短路.
d(i,j):i 到 j 的距离. r(i,j):i 到 j 之间的插入点. 输入: 带权邻接矩阵W (w(i, j))vv.
(1) 赋初值:对所有 i,j, d(i,j)w(i,j), r(i,j)j, k1.
3)设v*是使l(v)取最小值的S 中的顶点,则令
S=S∪{v*},u v* 4) 若S φ,转 2,否则,停止.
用上述算法求出的l (v ) 就是u0 到 v 的最短 路的权,从v的先驱点标记 z(v)追溯到u0, 就得 到u0到v的最短路的路线.
第12页/共37页
Dijkstra算法
function [l,z]=Dijkstra(W)
路要经过点号为 ri(j k ) 的点. 算法开始于 R(0) (ri(j0) ) ,ri(j0) j ,
迭代到第k
步, ri(j k )
k, ri(j k 1) ,
若di(jk 1) di(kk 1) dk(jk 1) , 否则
即由 D(k1)到 D(k)迭代,若某个元素改变(变小),则由 R(k1)到
迭代 次数
1 2 3 4 5 6 7 8 最后标记 l (v)
z (v)
l(ui )
u0
u1
u2
u3
u4
u5
u6
u7
0
12
7 4
8
2
4 7 4
8
3
7
4
8
69 4
8
69
6
9
6
9
012
36
9
46
u0
u0 u0
u2
u3
u3
u0
u6
第9页/共37页
u1
u2
u7
u0
u4
u3
u6
u5
第10页/共37页
Dijkstra算法:求G中从顶点u0到其余顶点的最短路 设G为赋权有向图或无向图,G边上的权均均非负.
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;
第13页/共37页
if j<i
i=j-1;
end
R(k)迭代中,相应元素改为k ,表示到第k 次迭代,从vi到v j 的最
短路过点vk 比过原有中间点更短.
在求得 D( )时求得 R( ),可由 R( )来查找任何点对之间
最短路的路径.
第20页/共37页
(III)查找最短路路径的方法.
若ri(j ) a1,则点va1是点vi到点v j 的最短路的中间点.
end
end
i=i+1;
end
第14页/共37页
0 1 2 7 4 8
1
0
2
3
7
2 2 0 1 5
W
7
3
1 5
0 3
3 0
6 4
3
6 4 0 6 4
4
3
6
0
2
8 7 4 2 0
l =0 1 2 3 6 9 4 6
z =0 0 0 2 3 3 0 6
第15页/共37页
u1
u2
u7
u0
u4
u3
u6
u5
见Matlab程序-Dijkstra.m
第16页/共37页
三、Floyd 算法
可用来求任意两顶点间的最短路. 算法思想:
第17页/共37页
算法的关键点
• (I)求距离矩阵的方法. •(II)求路径矩阵的方法. •(III)查找最短路路径的方法.
9
3
D(5)
5 7
402 620
5 3
1 3,
10 9 5 3 0 5
2 3 1 3 5 0
插入点 v6,得:di(jk ) min{di(jk1) , di(kk 1) dk(jk 1)},
代替 l(v) ,计算 min{l(v)},并把达到这个最小值
的一个顶点记为
vS i
ui1,置Si1
Si
{ui 1}.
3) 若 i 1,则停止;若i 1 ,则用 i+1 代
替i,并转2).
第6页/共37页
第7页/共37页
定义 根据顶点v的标号l(v)的取值途径,使 u0到v 的最短路中与v相邻的前一个顶点w,称为v的先驱 点,记为z(v), 即z(v)=w.
代替 l(v) ,计算 min{l(v)},并把达到这个最小值
的一个顶点记为
vS i
ui1,置Si1
Si
{ui 1}.
3) 若 i 1,则停止;若i 1 ,则用 i+1 代
替i,并转2).
第5页/共37页
Dijkstra算法: 求G中从顶点u0到其余顶点的最短路.
1) 置l(u0) 0,对v u0 ,l(v) ,S0 {u0} i 0 且 2) 对每. 个 v Si ,用 min{l(v),l(ui ) w(ui,v)}
3) 把赋权图G中一条路的权称为它的长,把(u,v) 路的最小权称为u和v之间的距离,并记作 d(u,v).
第1页/共37页
1) 赋权图中从给定点到其余顶点的最短路
最短路是一条路,且最短路的任一节也是最短路. 求下面赋权图中顶点u0到其余顶点的最短路.
假设G为赋权有向图或无向图,G边上的权均非 负.若(u,v) E(G) ,则规定 w(u,v) .1046 3D(3)
5
7
4 6
0 2
2 1 0 3 3,
3 0 5
2 3 1 3 5 0
插入点 v4,得:di(jk ) min{di(jk1) , di(kk 1) dk(jk 1)},
0 1 5 7 10 2
1 2 2 3 4 6
1
046
9
3
1
2
3
3
4
1
D(4)
5 7
0 1 5 7 2
1 2 2 3 5 6
1
0
4
6 3
1
2
3
3
5
1
D(3)
5
7
2
4 6 3
0 2 1
2 0 3 3
3 0 5
1 3, 5
0
R(3)
2 3
1
1
2 3 2 1
3 3 3 3
4 4 4 4
5 5 5 5
6 6, 6
6
第26页/共37页
0 1 5 7 2
对每个顶点,定义两个标记(l(v),z(v)),其中: l(v) :表从顶点u0到v的一条路的权.
z(v) :v的先驱点,用以确定最短路的路线. 算法的过程就是在每一步改进这两个标记,使最终 l(v)为从顶点u0到v的最短路的权. S:具有永久标号的顶点集. 输入: G的带权邻接矩阵 w(u,v)
第11页/共37页
402 620
10 9 5 3 2 3 1 3
5 3 0 5
1 3, 5
0
R(4)
2 3
4
1
2 3 4 1
3 3 4 3
4 4 4 4
4 5 5 5
6 6, 6
6
插入点 v5,得: D(5) D(4) , R(5) R(4),
第27页/共37页
0 1 5 7 10 2
1
046
先驱点可用于追踪最短路径. 例5的标号过程也 可按如下方式进行: 首先写出左图带权邻接矩阵
0 1 2 7 4 8
1
0
2
3
7
2 2 0 1 5
W 3 1 0 3 6
7 5 3 0 4 3
6
4
0
6
4
4 3 6 0 2
8
7
4
2
0
因G是无向图,故W是对称阵.
第8页/共37页
1 1 3 4 5 6
矩阵中带“=”的项为经迭代比较以后有变化的元素.
第25页/共37页
0 1 5 2
1
0
4
3
D(2)
5
4
0 2
2 0
1 3 3,
3 0 5
2 3 1 3 5 0
插入点 v3,得:di(jk ) min{di(jk1) , di(kk 1) dk(jk 1)},
3 3
45 45
6 6,
3 0 5
2 3 1 3 5 0
1 2 3 4 5 6
1 1 3 4 5 6
矩阵中带“=”的项为经迭代比较以后有变化的元素.
第24页/共37页
0 1 2
1
0
4
3
4 0 2 1 D(1) 2 0 3 3,
3 0 5
插入点
v2,得:
di(jk )
1
0
4
4
D (0)
4
0 2
2 0
3
1 3,
3 0 5
2 4 1 3 5 0
1 2 3 4 5 6
1
2
3
4
5
6
R (0)
1
1
2 2
3 3
4 4
5 5
6 6,
1 2 3 4 5 6
1 2 3 4 5 6
第23页/共37页
0 1 2
1
0
4
4
D (0)
4
0 2
代替 l(v) ,计算 min{l(v)},并把达到这个最小值
的一个顶点记为
vS i
ui1,置Si1
Si
{ui 1}.
3) 若 i 1,则停止;若i 1 ,则用 i+1 代
替i,并转2).
第4页/共37页
Dijkstra算法: 求G中从顶点u0到其余顶点的最短路.
1) 置l(u0) 0,对v u0 ,l(v) ,S0 {u0} i 0 且 2) 对每. 个 v Si ,用 min{l(v),l(ui ) w(ui,v)}
min{d2i(jk
3 1)
,
1
di(kk
3 1)
5
dk(0jk1)},
0 1 5 2
1
0
4
3
D(2)
5
4
0 2
2 0
1 3 3,
3 0 5
2 3 1 3 5 0
1 2 2 4 5 6
1
2
3
4
5
1
R(2)
2 1
2 2
3 3
4 4
5 5
6 6,
1 2 3 4 5 6