网站大量收购闲置独家精品文档,联系QQ:2885784924

第讲贪心算法精要.ppt

  1. 1、本文档共56页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Algorithm 8.2 SHORTESTPATH Input: A weighted directed graph G=(V,E), where V={1,2,..,n}. Output: The distance from vertex 1 to every other vertex in G. Assume that we have an empty heap H at the beginning. 1.Y?V-{1}; λ[1]?0; key(1)? λ[1] 2.for y?2 to n 3. if y is adjacent to 1 then 4. λ[y]=length[1,y] 5. key(y)? λ[y] 6. INSERT(H,y) 7. else 8. λ[y]? ∞ 9. key[y]? λ[y] 10. end if 11. end for NEXT PAGE Algorithm 8.2 SHORTESTPATH 12. for j?1 to n-1 13. y?DELETEMIN(H) 14. Y?Y-{y} 15. for each vertex w ∈Y that is adjacent to y 16. if λ[y]+length[y,w] λ[w] then 17. λ[w]? λ[y]+length[y,w] 18. key(w)? λ[w] 19. end if 20. if w H then INSERT(H,w) 21. else SIFTUP(H,H-1(W)) 22. end if 23. end for 24. end for O(mlog n) 最小生成树问题(Kruskal算法) 定义8.1:设G = (V, E)是一个具有含权边的连通无向图。G的一棵生成树(V,T)是G的作为树的子图。如给G加权并且T的各边的权的和为最小值,那么(V,T)就称为最小耗费生成树,简称生成树。 Kruskal算法: 对G的边以非降序权重排列; 对排好序的每条边,如果将其加入T不会形成回路,则加入树T中;否则将其丢弃。 例: Kruskal算法 6 1 2 3 5 4 1 2 13 11 3 9 7 4 6 (1,2) (1,3) (4,6) (5,6) (2,3) (4,5) (3,4) (2,4) (3,5) 1 2 3 4 6 7 9 11 13 6 1 2 3 5 4 若构成回路,则丢弃该边 Kruskal算法的实现 表示森林的数据结构 用不相交集数据结构来表示森林 初始时,图的每个顶点由包含一个顶点的树表示 算法执行时,森林中的每个连通分量由一棵树来表示 选择权值最小的边将两个连通分量连接起来由Union操作实现 Algorithm 8.3 KRUSKAL Input: A weighted connected undirected graph G=(V,E) with n vertices. Output: The set of edges T of a minimum cost spanning tree for G. 1.Sort the edges in E by nondecreasing weight 2.for each vertex v∈V 3. MAKESET{v} 4.end for 5.T={} 6.while |T|n-1 7. Let (x,y) be the next edge in E. 8. if FIND(x) ?FIND(y) then 9. Add(x,y) to T 10 UNION(x,y) 11 end if 12. end while Kruskal算法正确性证明 引理8.2:在含权无向图中,Kruskal算法能正确地找出最小生成树 证明: 对T的大小实施归纳法,证明T是最小生成树边集的子集 初始时,T={},命题成立; 设加入边e = (x,y)之前命题成立,即有T?T*,其中T*是最小生成树边的集合; 设X是包含x的子树的顶点集,T’=T∪{e},需证明T’也是最小生成树边集T*的子集。 Kruskal算法正确性证明 由于T?T*,若T*包含e,则T’=T∪{e} ?T*; 若T*不包含e,则T*∪{e}必定包含以e为一条边的回路; e=(x,y)连接了X中的一个顶点和V-

文档评论(0)

宝贝计划 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档