最短路径单源最短路径问题单源最短路径问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调用①
1
§7.6.1 单源最短路径问题
观察
10 0
1 30
50 10
2 20
100
4 60 3
源点 中间顶点 终点
0
1
0
3
03
2
0 3,2
4
长度
10 30 50 60
上表是按路径长度递增序产生的从源点到其余顶点的最短路径
0到4的路径:<0,4>, <0,3,4>, <0,1,2,4>, <0,3,2,4> 长度: 100, 90, 70, 60
4
§7.6.1 单源最短路径问题
如何扩充红点集?
Th.7.6.1 若k是白点集中估计距离最小的顶点,则k的估计距离就是最短距 离。即:若D[k]=min{ D[i]:∀i∈V-S },则D[k]=SD[k] Pf(反证法) 设D[k]不是k的最短距离,则必存在一条路径P:s p k,其长度
Length(p)<D[k] (式1)
算法思想- Dijkstra(1972图灵奖得主) 基于上述观察 初始化:仅已知源s的最短距离SD(s)=0,故红点集S={s}; 扩充红点集:算法的每一步均是在当前白点集中选一最短距离最小的白点 来扩充红点集,以保证算法是按长度增序来产生各顶点的最短路径; 结束:当前白点集空或仅剩下最短距离为∞的白点为止。注:若s到某白 点的路径不存在,可假设该白点的最短路径是一条长度为∞的虚拟路径。
7
§7.6.1 单源最短路径问题
如何构造最优解
因为D向量只记录了最优解的值,但不能得到最优解。因 此,要记录最优解则须引入附加信息。
因为最优解是最短路径树,故只需增加一个向量P[0..n-1], 用P[i]记录顶点的双亲,由双亲的唯一性知,顶点i的最短路 径可从P[i]反复上溯至根(源点)即可求得最优解。
Boolean S[n];//S是红点集。S[i]为真表示j为红点,否则为白点 for ( i=0; i<n; i++) { //初始化
S[i]=FALSE; D[i]=G[s][i]; //置初始的估计距离 if ( D[i]<Infinity ) P[i]=s; //s是i的前驱(双亲) else P[i]=-1; // i无前驱,注意P[s]亦无前驱 } S[s]=TRUE; D[s]=0;//红点集仅有源点s
Fra Baidu bibliotek 算法实现
G[i][j]=
∞
if <i,j>不是边
w(<i,j>) otherwise
8
§7.6.1 单源最短路径问题
void Dijkstra ( AdjMatrix G, Distance D, Path P, int s ){
//0≤s ≤n-1,若<i,j>不是边,则G[i][j]=Infinity
由式1,2得:D[k]>length(P)≥D[x],这与k是当前白点集中估计距离最小的顶 点矛盾! k是最短距离最小的白点吗? 定理保证了k加入红点集的正确性
5
§7.6.1 单源最短路径问题
如何调整白点集中白点的估计距离? 由于新红点k可能导致剩余白点的估计距离变小,使之离源点更 近,故需调整。 设∀j∈V-S,若D[j]由于k加入红点集而变小,则新路径P必是 s p1 k p2 j,且P1中只有红点,P2必是边<k,j>,即: Length(p)= D[k] + w<k,j>. 证明:略 调整方法 若length(P)<D[j],则用length(P)来修正D[j]。
¾ 规律:当按长度增序生成从源s到其它顶点的最短路径时,则当前正 在生成的最短路径上除终点外,其余顶点的最短路径均已生成
¾ 例子:当求0到2的最短路径时,则该路径<0,3,2>上顶点0,3的最短路
径在此前已生成
2
§7.6.1 单源最短路径问题
约定 从源s到终点v的最短路径简称为v的最短路径,SP(v) s到v的最短路径长度简称为v的最短距离,SD(v) 红点集S:最短距离已确定的顶点集合 白点集V-S:最短距离尚未确定的顶点集合
3
§7.6.1 单源最短路径问题
如何扩充红点集? ∵白点k的最短路径上除终点外,其余顶点的最短路径均已生成,故它们均 为红点 ∴设置向量D[0..n-1],对每一个白点v∈V-S,用D[v]记录从源点s到达v, 且除v外中间不经过任何白点的“最短”路径长度。初始时每个白点v的 D[v]值是边<s,v>上的权。 Note:从s到v的中间不经过其他白点的路径可能不止1条,但只需将其中最 短的那条的长度记录在D[v]中。 D[v]=SD[v]?即D[v]是v最终的最短距离吗?不一定,因为s到v可能存在 包含其它白点作为中间点的更短路径。 D[v]只是v当前估计的最短距离(简称估计距离),即:D[v]≥SD[v] 如何在当前白点集中选一最短距离最小的白点k来扩充红点集?
由D[k]定义知,P至少包含1个白点作为中间点,不妨设x是P上第1个白点,则P 可分解为: s p1 x, x p2 k。其中P1中仅有x为白点,由D[x]定义知 length[P1]≥D[x],又因权为非负,故length[P2]≥0,所以
length(P)=length(P1)+length(P2)≥ D[x] (式2)
2 20
100
4 60 3
最短距离:红色 估计距离:白色 依次求出的最短距离为: 1) D[0]=0 2) D[1]=10,调整顶点2 3) D[3]=30,调整顶点2,4 4) D[2]=50,调整顶点4 5) D[4]=60
¾ 最短路径树:各顶点的最短路径(实线)总是一棵以源点为根的树,称之
为最短路径树。
6
1
§7.6.1 单源最短路径问题
例子
10 10
1
0
0 100 100
30 4
∞2
3 30
10 10
1
50
60 2
0 0 100
100 30 4
3 30
10 10
1
50 2
0 0
30
4 90
60
20 3 30
0
10 0
10 1
30
10
4 60
50 2 20 3 30
10 0 1 30 50 10
§7.6 最短路径
应用背景:交通咨询、导航 约定
有向图
设V={0,1,…,n-1},边上的权值非负(长度) 分类
①单源最短路径:1个源点到其余顶点的最短路径 ②单目标最短路径:将各边反向,即为问题1 ③单点对间最短路径:可用①来解,但二者渐近时间相同 ④所有点对间最短路径:亦可用①来解,即每个顶点作为源点
1
§7.6.1 单源最短路径问题
观察
10 0
1 30
50 10
2 20
100
4 60 3
源点 中间顶点 终点
0
1
0
3
03
2
0 3,2
4
长度
10 30 50 60
上表是按路径长度递增序产生的从源点到其余顶点的最短路径
0到4的路径:<0,4>, <0,3,4>, <0,1,2,4>, <0,3,2,4> 长度: 100, 90, 70, 60
4
§7.6.1 单源最短路径问题
如何扩充红点集?
Th.7.6.1 若k是白点集中估计距离最小的顶点,则k的估计距离就是最短距 离。即:若D[k]=min{ D[i]:∀i∈V-S },则D[k]=SD[k] Pf(反证法) 设D[k]不是k的最短距离,则必存在一条路径P:s p k,其长度
Length(p)<D[k] (式1)
算法思想- Dijkstra(1972图灵奖得主) 基于上述观察 初始化:仅已知源s的最短距离SD(s)=0,故红点集S={s}; 扩充红点集:算法的每一步均是在当前白点集中选一最短距离最小的白点 来扩充红点集,以保证算法是按长度增序来产生各顶点的最短路径; 结束:当前白点集空或仅剩下最短距离为∞的白点为止。注:若s到某白 点的路径不存在,可假设该白点的最短路径是一条长度为∞的虚拟路径。
7
§7.6.1 单源最短路径问题
如何构造最优解
因为D向量只记录了最优解的值,但不能得到最优解。因 此,要记录最优解则须引入附加信息。
因为最优解是最短路径树,故只需增加一个向量P[0..n-1], 用P[i]记录顶点的双亲,由双亲的唯一性知,顶点i的最短路 径可从P[i]反复上溯至根(源点)即可求得最优解。
Boolean S[n];//S是红点集。S[i]为真表示j为红点,否则为白点 for ( i=0; i<n; i++) { //初始化
S[i]=FALSE; D[i]=G[s][i]; //置初始的估计距离 if ( D[i]<Infinity ) P[i]=s; //s是i的前驱(双亲) else P[i]=-1; // i无前驱,注意P[s]亦无前驱 } S[s]=TRUE; D[s]=0;//红点集仅有源点s
Fra Baidu bibliotek 算法实现
G[i][j]=
∞
if <i,j>不是边
w(<i,j>) otherwise
8
§7.6.1 单源最短路径问题
void Dijkstra ( AdjMatrix G, Distance D, Path P, int s ){
//0≤s ≤n-1,若<i,j>不是边,则G[i][j]=Infinity
由式1,2得:D[k]>length(P)≥D[x],这与k是当前白点集中估计距离最小的顶 点矛盾! k是最短距离最小的白点吗? 定理保证了k加入红点集的正确性
5
§7.6.1 单源最短路径问题
如何调整白点集中白点的估计距离? 由于新红点k可能导致剩余白点的估计距离变小,使之离源点更 近,故需调整。 设∀j∈V-S,若D[j]由于k加入红点集而变小,则新路径P必是 s p1 k p2 j,且P1中只有红点,P2必是边<k,j>,即: Length(p)= D[k] + w<k,j>. 证明:略 调整方法 若length(P)<D[j],则用length(P)来修正D[j]。
¾ 规律:当按长度增序生成从源s到其它顶点的最短路径时,则当前正 在生成的最短路径上除终点外,其余顶点的最短路径均已生成
¾ 例子:当求0到2的最短路径时,则该路径<0,3,2>上顶点0,3的最短路
径在此前已生成
2
§7.6.1 单源最短路径问题
约定 从源s到终点v的最短路径简称为v的最短路径,SP(v) s到v的最短路径长度简称为v的最短距离,SD(v) 红点集S:最短距离已确定的顶点集合 白点集V-S:最短距离尚未确定的顶点集合
3
§7.6.1 单源最短路径问题
如何扩充红点集? ∵白点k的最短路径上除终点外,其余顶点的最短路径均已生成,故它们均 为红点 ∴设置向量D[0..n-1],对每一个白点v∈V-S,用D[v]记录从源点s到达v, 且除v外中间不经过任何白点的“最短”路径长度。初始时每个白点v的 D[v]值是边<s,v>上的权。 Note:从s到v的中间不经过其他白点的路径可能不止1条,但只需将其中最 短的那条的长度记录在D[v]中。 D[v]=SD[v]?即D[v]是v最终的最短距离吗?不一定,因为s到v可能存在 包含其它白点作为中间点的更短路径。 D[v]只是v当前估计的最短距离(简称估计距离),即:D[v]≥SD[v] 如何在当前白点集中选一最短距离最小的白点k来扩充红点集?
由D[k]定义知,P至少包含1个白点作为中间点,不妨设x是P上第1个白点,则P 可分解为: s p1 x, x p2 k。其中P1中仅有x为白点,由D[x]定义知 length[P1]≥D[x],又因权为非负,故length[P2]≥0,所以
length(P)=length(P1)+length(P2)≥ D[x] (式2)
2 20
100
4 60 3
最短距离:红色 估计距离:白色 依次求出的最短距离为: 1) D[0]=0 2) D[1]=10,调整顶点2 3) D[3]=30,调整顶点2,4 4) D[2]=50,调整顶点4 5) D[4]=60
¾ 最短路径树:各顶点的最短路径(实线)总是一棵以源点为根的树,称之
为最短路径树。
6
1
§7.6.1 单源最短路径问题
例子
10 10
1
0
0 100 100
30 4
∞2
3 30
10 10
1
50
60 2
0 0 100
100 30 4
3 30
10 10
1
50 2
0 0
30
4 90
60
20 3 30
0
10 0
10 1
30
10
4 60
50 2 20 3 30
10 0 1 30 50 10
§7.6 最短路径
应用背景:交通咨询、导航 约定
有向图
设V={0,1,…,n-1},边上的权值非负(长度) 分类
①单源最短路径:1个源点到其余顶点的最短路径 ②单目标最短路径:将各边反向,即为问题1 ③单点对间最短路径:可用①来解,但二者渐近时间相同 ④所有点对间最短路径:亦可用①来解,即每个顶点作为源点