icpc培训课件生成树小.pptxVIP

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

最小生成树王阳睿

参考学习资料图书:《算法竞赛入门经典》,刘汝佳编著,清华大学出版社,2009-11-01《算法竞赛入门经典训练指南》,刘汝佳、陈锋编著,清华大学出版社,2012-10-1《ACM-ICPC程序设计系列—及应用》,冯林,金博,于瑞云编著,哈尔滨工业大学出版社《图论算法理论.实现及其应用》,王桂平等,北京大学出版社网址:练习题:HDU1233还是畅通工程HDU1879继续畅通工程HDU1162Eddyspicture哈理工OJ11011131

最小生成树定义任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通).加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和.最小代价生成树是其所有生成树中代价最小的生成树.简单的说:用最小代价把所有点都连起来

一、Prim算法时间复杂度:O(n^2)n为节点数

prim算法描述基于点的贪心算法流程:1.初始化:把顶点Vo并入点集合U,并计算其他邻节点到集合U的最小代价(距离)。2.松弛:选取一个到集合U代价最小的点P,并加入集合U,并根据点P更新所有邻节点点到U的代价。3.重复步骤2,直到选完所有的点。中心思想:时刻寻找到集合U(最小生成树)最近的点并加入U

代码实现:例题poj2421代码在附件

二、kruskal算法时间复杂度:O(eloge)e为边数

中心思想:基于边的贪心,时刻选取权值最小的边构造最小生成树

kruskal算法描述1.将每个点作为单独集合2.从小到大选取每一边,若选取的边的两节点属于不同一集合,则加入边集E,并且两个节点的集合合并。若属于同一集合则舍弃这条边3.循环2步骤,直到边集E元素数量=n-1。4.边集E即为最小生成树的边

kruskal的难点、关键如何判断欲加入的一条边是否与生成树中已保留的边形成回路?

例子:14325291012836714325236143252836

kruskal模板例题poj1258代码在附件

prim和kruskal运用注意事项当图为稀疏图时,kruskal较为合适,否则prim较为合适。如果所有m条边权值都不相同,则最小生成树是唯一的;否则,prim算法(kruskal)需要在多条边权相同的边中任意选择。具体的方案决定了最后得到的是哪一个最小生成树。prim算法只需少量改动就可以变成Dijkstra算法实用的Prim算法需要用到二插堆或者类似的数据结构,但是Kruskal算法只用到并查集和排序,容易实现并且往往更加高效

prim和kruskal典型运用场合当求直接或间接节点连通所需代价的时候,可以考虑最小生成树问题。1.最大生成树(权值加负号)2.乘积最大生成树(权值取log)3.最小瓶颈树(就是求最小生成树,从kruskal证明)4.次小生成树(枚举最小生成树的边,去除该边后,加入一条另外的边,得到新的生成树,所有这些新的生成树中的最小者,即为第2小的生成树。)5.判断最小生成树是否唯一

最小生成树举例2题目描述学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们中间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。现在由你负责连接这些计算机,你的任务是使任意两台计算机都连通(不管是直接的或间接的)。输入第1行为整数n(2=n=100),表示计算机的数目。此后的n行,每行n个整数。第x+1行y列的整数表示直接连接第x台计算机和第y台计算机的费用。输出输出只有一个整数,表示最小的连接费用。示例输入3012101210示例输出2

#includestdio.h#includestring.h#defineMAXN100intg[MAXN+1][MAXN+1];//邻接矩阵intl[MAXN];//{l[i]存放顶点i到当前已建成的生成树中任意一顶点j的权值g[i][j]的最小值}boolu[MAXN];//u[i]=true表示顶点i还未加入到生成树中;u[i]=false表示顶点i已加入到生成树中intmain(){intn,i,j;scanf(%d,n);for(i=1;i=n;i++)for(j=1;j=n;j++)scanf(%d,g[i][j]);memset(l,0x7f,sizeof(l));//初始化为maxintl[1]=0;//开始时生成树中只有第1个

文档评论(0)

gcq的书屋 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档