最短路算法-XX-BIG

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S = {s}; d(s) = 0; p(s) = NULL; Update(s); WHILE S V DO
i = FindMin(); S = S U {i}; Update(i); END WHILE
2014年春季 2020/5/31
Step
0 1 2 3 4 5
S
d(a), p(a)
s
2, s
2014年春季 2020/5/31
最短路径树
最短路径树是生成树么?
是的
最短路径树是最小生成树么? 不一定
2 S
2
A 1 C
1
1 B
2 S
2
A C
1 B
S 2
A C
1 1
B
2014年春季 2020/5/31
Dijkstra的求解思路
算法思路
逐步地发展最短 路径树,直至它 覆盖所有顶点。
怎样实现?
构造一个循环, 每次循环都增加 一个顶点到最短
最短路算法-XX-BIG
2020年5月31日星期日
最短路算法
毫无疑问,重点将是以Dijkstra算法为代表的 Label-Setting算法。
1 Label-Setting算法 2 Label-Correcting算法 3 All-Pair最短路算法
2014年春季 2020/5/31
Label-Setting算法
FindMin () Find vertex v in V – S which
has minimum d(v); RETURN v;
2014年春季 2020/5/31
Update ( i ) FOR each edge e incident to i DO
IF e.weight + d(i) < d(e.head) d(e.head) = e.weight + d(i); p(e.head) = i;
怎样根据得到d的(he这a.hs些ema信din) 息i=me重u.wm构edig出(vh)最t;+短d(路i);径?
p(e.head) = i; RETURN v; END IF
每条边被检EN查D 了FO(R被描黑)几次?
如果放松“连通图”假设,如何改进代码?
Dijkstra算法代码设计
d(j)和p(j)
在CGraph中增加一个CVertex的map
2014年春季 2020/5/31
Dijkstra算法代码设计
从伪码到 代码
d(j)和p(j)
DijkstraAlg函数放在哪里? option 1:作为一个独立的
如何管理
函数 option 2:作为CGraph的成
员函数
DijkstraAlg
思路
1 2 3 4 5
2014年春季 2020/5/31
基本Dijkstra算法 分析(Analysis) 扩展(Extension) 加速(Speed up) 应用(Application)
基本Dijkstra算法
Dijkstra算法
问题分析 求解思路 伪码描述 算法示例
代码设计
Dijkstra算法是本课程的核心内容, 务必要掌握其思想和具体的编程方法。
Dijkstra算法代码设计
d(j)和p(j)
从伪码到 代码
如何管理
如何管理这些CVertex对象? Q 1:用什么数据结构? Q 2:这个数据结构放在哪里 ?
思路 • 用一个map,以ID为key; • 放在CGraph里面。
细节
代码设计
• 如何初始化? • 什么时候需要查询/访问?
创建一个CVertex类
sa
2, s
sae saed
saedb
saedbc
d(b), p(b)
6, a
6, a 6, a
6, a
d(c), p(c)
d(d), p(d)
d(e) ,
4,ps(e)
4, a 3, a
4, a 3, a
6, d 4, a
6, d 6, d
Update ( i )
FORFeinadcMh iend(g) e e incident to i DO IF e.weight + d(i) < d(e.head) THEN Find vertex v in V – S which
2014年春季 2020/5/31
问题描述
单源最短路问题 给定有向加权图G(V, E),给定源点/起 始点s,求从s出发到V中其它所有顶点 的权重最小的路径。
假设
1) 权重为正整数; 2) 连通图; 3) 存在多条最短路
时,只求1条.
所有这些最短路构成的是一个怎样的子图? 树最短路径树
为什么一定是树? 最短路上的子路径也是最短路
• 两种都可以,但前者需要传 入图对象;
• 为了方便,放在CGraph里。
细节
代码设计
• 使用了哪些CGraph里的成员
创建一个CVertex类
变量? • 如何设计输出?
END IF END FOR
d(j): 顶点j的距离标记。 p(j): 顶点j在最短路径树上的前继点。 S: 最短路径树上的顶点集合。
Dijkstra算法示例
2,s a4
2
6,a
b 2
s 0
4
12
e
3
4,s 3,a
3
c
6,d
2 d
4,a
DijkstraAlg (G(V, E), s)
FOR all vertex j in V DO d(j) = ; p(j) = NULL;
伪码描述
DijkstraAlg (G(V, E), s) FOR all vertex j in V DO
d(j) = ; p(j) = NULL; S= {s}; d(s)=0; p(s)= NULL; Update(s); WHILE S V DO
i = FindMin(); S = S U {i}; Update(i); END WHILE
从伪码到 代码
如何实现d(j)和p(j) Option 1:单独用数组/vector 来实现; Option 2:创建一个CVertex 类来记录;
思路 • 两个方法都可以; • 使用类便于扩展和封装。
代码设计 创建一个CVertex类
细节 • 构造函数? • 接口函数?
2014年春季 2020/5/31
路径树上。
来自百度文库
如何维护最短路径树 ?树上顶点的集合S。
顶点的前继p(i)。
如何选择顶点?
FindMin()
如何更新距离标记 ?Update(i)
2014年春季 2020/5/31
距离标记?
每次循环都需要 对距离标记进行
更新。
加哪个顶点?
从所有与树邻接 的顶点中,选择 离源点最近的。
怎么知道谁最近?
对每个顶点,都 用一个距离标记 (Label)来记录。
相关文档
最新文档