数据结构与算法 图的遍历上与连通性.pptVIP

数据结构与算法 图的遍历上与连通性.ppt

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构与算法 图的遍历上与连通性

艾兹格 · W · 迪杰斯特拉 Edsger Wybe Dijkstra,生于1930 年 5 月 11 日,卒于 2002 年 8 月 6 日,荷兰人。 计算机科学家,毕业并就职于荷兰 Leiden 大学,早年钻研物理及数学,而后转为计算科学。曾在 1972 年获得过素有计算机科学界的诺贝尔奖之称的图灵奖。 * 5 0 4 6 1 3 2 28 10 25 14 24 22 16 18 12 H = {(1,6,14), (3,6,18), (4,6,24), (0,1,28)} ed = (1, 6, 14) Vmst = {t, t, t, t, t, t, f} Vmst = {t, t, t, t, t, t, t} 最小生成树中边集合里存入的各条边为: (0, 5, 10), (5, 4, 25), (4, 3, 22), (3, 2, 12), (2, 1, 16), (1, 6, 14) * Prim算法适用于边稠密的网络。 Kruskal算法不仅适合于边稠密的情形,也适合于边稀疏的情形。 注意:当各边有相同权值时,由于选择的随意性,产生的生成树可能不唯一。 * 最短路径 (Shortest Path) 最短路径问题:在图中,从某一顶点(称为源点)到另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。 问题解法 边上权值非负情形的单源最短路径问题 — Dijkstra算法 ? (仅讲此算法) 边上权值为任意值的单源最短路径问题 — Bellman和Ford算法 ? (不讲) 所有顶点之间的最短路径 — Floyd算法 ? (不讲) * 边上权值非负情形的 单源最短路径问题 问题的提法:给定一个带权有向图 D 与源点 v,求从 v 到 D 中其他顶点的最短路径。限定各边上的权值大于或等于 0。 为求得这些最短路径, Dijkstra 提出按路径长度的递增次序, 逐步产生最短路径的算法。首先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从顶点 v 到其它各顶点的最短路径全部求出为止。 * Dijkstra逐步求解的过程 源点 终点 最短路径 路径长度 v0 v1 v2 v3 v4 1 0 4 3 2 10 100 30 50 20 60 10 (v0,v1) — (v0,v3) (v0,v4) 10 ? 30 100 ,60 ,90 (v0,v1,v2) (v0,v3,v4) (v0,v3,v2) ,50 ,60 (v0,v3,v2 ,v4) * 引入辅助数组dist。它的每一个分量dist[i]表示当前找到的从源点 v0 到终点 vi 的最短路径的长度。初始状态: 若从v0到顶点vi有边, 则dist[i]为该边的权值; 若从v0到顶点vi无边, 则dist[i]为? 。 假设S是已求得的最短路径的终点的集合,则可证明:下一条最短路径必然是从v0 出发,中间只经过 S 中的顶点便可到达的那些顶点vx (vx ? V-S )的路径中的一条。 每次求得一条最短路径后, 其终点vk 加入集合S,然后对所有的vi ?V-S,修改其 dist[i]值。 * Dijkstra算法可描述如下: ① 初始化: S?{v0}; dist[j]?Edge[0][j], j = 1, 2, …, n-1; // n为图中顶点个数 ② 求出最短路径的长度: dist[k]?min { dist[i] }, i?V-S ; S?S∪{k}; ③ 修改: dist[i]?min{dist[i], dist[k]+Edge[k][i]}, 对于每一个 i?V-S ; ④ 判断:若 S = V, 则算法结束,否则转②。 * 计算从单个顶点到其他各顶点 最短路径的算法 void ShortestPath (GraphT, E G, T v, E dist[ ], int path[ ]) { // Graph是一个带权有向图。dist[j], 0≤jn, 是当前 // 求到的从顶点v到顶点j的最短路径长度, path[j], // 0≤jn, 存放求到的最短路径。 int n = G.

文档评论(0)

189****6649 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档