第11篇 数据构 贪婪算法.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 应 用 ③ 修改从v出发到集合V?S上任一顶点vk可达的最短路径长度。如果D[j] + arcs[j][k] D[k],则修改为D[k] = D[j] + arcs[j][k]。 ④ 重复操作②、③共n?1次,由此求得从v到图上其余各顶点的最短路径是依路径长度递增的序列。 求有向图的最短路径,数据存储类型使用邻接矩阵,故算法设置为GraphMatrix类的成员函数。 最短路径算法见以下程序。 应 用 应 用 例11-6 假设要在n个城市之间建立通信网络,而连通n个城市一般只需要n?1条线路。由于n个城市中的每两个城市之间都可建立一条线路,因此最多可有n(n?1)/2条线路可供选择,本问题的关键就是如何在这些可能的n(n?1)/2条线路中选择n?1条线路,使得建立这个通信网的成本最低。 n个城市及其可能设置的通信线路可用连通网来表示,其中网的顶点表示城市,边表示两城市之间的线路,边的权值表示相应的代价。由于具有n个顶点的连通网包含多棵不同的生成树,每一棵生成树都可能是一个通信网且总代价不同,因此该问题的解决就要通过构造连通网的最小代价生成树来完成。 例11-6 最小代价生成树的构造有多种算法,其中大多数算法利用了最小生成树的MST性质,该性质描述为:假设N = (V, {E})是一个连通网,U是顶点集V的一个非空子集,若(u, v)是一条具有最小权值(代价)的边,其中u∈U,v∈V?U,则必存在一棵包含边(u, v)的最小生成树。 上述性质可用反证法来证明。假设网N的任何一棵最小生成树都不包含(u, v),设T是连通网上的一棵最小生成树,当将边(u, v)加入到T中时,由生成树的定义,T中必存在一条包含(u, v)的回路。另外,由于T是生成树,则在T上必存在另一条边(u, v),其中u∈U,v∈V?U,且u和u之间,v和v之间均有路径相通,删去边(u, v),便可消除上述回路,同时得到另一棵生成树T。因为(u, v)的代价不高于(u, v),所以T的代价亦不高于T,T是包含(u, v)的一棵最小生成树。由此与假设矛盾。 下面介绍的普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法,就是两个利用MST性质构造最小生成树的算法。 应 用 最小代价生成树 1. 普里姆(Prim)算法 假设N = (V, {E})是连通网,TE是N上最小生成树中边的集合。算法从U = {u0}(u0∈V),TE = {}开始,重复执行下述操作:在所有u∈U, v∈V?U的边(u, v)∈E中找一条代价最小的边(u0, v0)并入集合TE中,同时v0并入U中,直至U = V为止。此时,TE中必有n?1条边,则T = (V, {TE})为N的最小生成树。 mst数组用于存放最小生成树。最小生成树的具体构造过程如下。 ① 任取一个顶点0加入生成树中,mst中存放从顶点0到其余各顶点的边,若无边,则将权值置为(INFINITY)。 应 用 ② 当前mst[0]到mst[n?2]中存放的边,都是一个顶点在生成树中,另一个顶点不在生成树中的边,从中选出权值最小的边mst[min],将其加入到最小生成树中,即将mst[0]与mst[min]互换。Mst[0].startNo是新加入到生成树的顶点,设该新加入的顶点为顶点k。 ③ 调整mst[1]到mst[n?2]。若不在生成树的边集中,从顶点s到顶点k的边上权值比原来顶点s到生成树中顶点的边上权值小,就需要将原来的边调整为(k, s)。 ④ 从mst[i]到mst[n?2]重复上述操作②和③(i=1, 2, …, n?3),每次当一个顶点在生成树中,另一个顶点不在生成树的边中时,选出一个权值最小的边,将这条边和不在生成树中的顶点加入到生成树中,并调整未加入到生成树的那些边,直到n?1条边都在生成树中,或者选出一条边上权值最小的边,其权值为∞,则该无向图网络不连通,不能构造一颗最小生成树为止。 应 用 构造图的最小生成树的过程如图所示: 应 用 邻接矩阵无向图的类描述: 应 用 邻接矩阵无向图的主要成员函数: 应 用 最小生成树生成算法: 应 用 应 用 应 用 对于下图(a)利用以上程序的算法依次输出生成树上的5条边分别为{(v1, v3), (v3, v6), (v6, v4), (v3, v2), (v2, v5)}。分析上面算法,普里姆算法的时间复杂度为O(n2),与网中的边数无关,因此该算法适于求边稠密网的最小生成树。 应 用 2. 克鲁斯卡尔(Kruskal)算法 该算法按照另一种方法

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档