(23)--4.5 贪心算法之Prim算法算法分析与设计.pptVIP

(23)--4.5 贪心算法之Prim算法算法分析与设计.ppt

  1. 1、本文档共12页,可阅读全部内容。
  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文档。上传文档
查看更多

贪心算法之Prim算法算法分析与设计

引言畅通工程若要将n个城市之间原有的公路改造为高速公路,这些城市之间原有公路网如右图所示,每条边上的数字表示高速公路的改造成本(单位:10亿元)。如何以最低的成本来构建高速公路网,使得任意两个城市之间都有高速公路相连?

引言最小生成树MinimalSpanningTrees(MST)任何只由图G的边构成,并包含G的所有顶点的树称为G的生成树加权无向图G的生成树的权重是该生成树的所有边的权重之和最小生成树是其所有生成树中权重最小的生成树N个顶点,选取N-1条边,构建一个连通图,且这N-1条边的权重之和最小

引言Prim算法普里姆算法算法于1930年由捷克数学家沃伊捷赫.亚尔尼克(VojtěchJarník)首次发现在1957年由美国计算机科学家罗伯特.C.普里姆(RobertC.Prim)独立发现1959年,杰出的荷兰计算机科学家艾兹格.W.迪杰斯特拉(EdsgerW.Dijkstra)再次发现了该算法又被称为亚尔尼克算法或普里姆-亚尔尼克算法具有贪心选择性质?贪心算法经典实例

算法设计设计思路(1)任意选定一点s,设集合S={s}(2)从不在集合S的点中选出一个点j使得其与S内的某点i的距离最短,则(i,j)就是生成树上的一条边,同时将j点加入S(3)转到(2)继续进行,直至所有点都己加入S集合

算法设计实例分析50461321025142422161850461210251422161231228

算法实现核心代码分析数据结构定义和初始化intn,m;//n存储顶点的数量,m存储边的数量intG[MAXN][MAXN];//存储图voidinit(){for(inti=0;in;i++){for(intj=0;jn;j++)G[i][j]=INF;//初始化图中两点间距离为无穷大}}

算法实现核心代码分析贪心选择voidprim(){intcloseset[n],//记录不在S中的顶点在S中的最近邻接点lowcost[n],//记录不在S中的顶点到S的最短距离,即到最近邻接点的权值used[n];//标记顶点是否被访问,访问过的顶点标记为1for(inti=0;in;i++){//初始化,S中只有第1个点(0)lowcost[i]=G[0][i];//获取其他顶点到第1个点(0)的距离,不直接相邻的顶点距离为无穷大closeset[i]=0;//初始情况下所有点的最近邻接点都为第1个点(0)used[i]=0;//初始情况下所有点都没有被访问过}used[0]=1;//访问第1个点(0),将第1个点加到S中

算法实现核心代码分析//每一次循环找出一个到S距离最近的顶点for(inti=1;in;i++){intj=0;//每一次循环计算所有没有使用的顶点到当前S的距离,得到在没有使用的顶点中到S的最短距离以及顶点号for(intk=0;kn;k++)if((!used[k])(lowcost[k]lowcost[j]))j=k;//如果顶点k没有被使用,且到S的距离小于j到S的距离,将k赋给jprintf(%d%d%d\n,closeset[j]+1,j+1,lowcost[j]);//输出S中与j最近邻点,j,以及它们之间的距离used[j]=1;//将j增加到S中//每一次循环用于在j加入S后,重新计算不在S中的顶点到S的距离,修改与j相邻的边到S的距离,即更新lowcost和closesetfor(intk=0;kn;k++){if((!used[k])(G[j][k]lowcost[k]))//松弛操作,如果k没有被使用,且k到j的距离比原来k到S的距离小{lowcost[k]=G[j][k];//将k到j的距离作为新的k到S之间的距离

文档评论(0)

177****2883 + 关注
实名认证
文档贡献者

热爱教育,专注于教育领域创作与分享,让我们共同进步。

1亿VIP精品文档

相关文档