算法与数据结构(C++语言版)(第2版)课件 第9章_图的应用16:9.pptx

算法与数据结构(C++语言版)(第2版)课件 第9章_图的应用16:9.pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Data Structures and Algorithms design | analyze | experiment | implement;;最小生成树的概念 连通图 最小生成树 MST的性质 最小生成树的构造算法 Prim算法 Kruskal算法;最小生成树(Minimum Spanning Tree):在加权连通图(连通网)的所有生成树中,各边权值之和最小的生成树,称为最小生成树。要注意: (1) 该定义是在无向连通图的基础上的; (2) 最小生成树可能不唯一,但是其权值之和是唯一的; (3) 对于n个结点的图,其生成树中必定有n-1条边;应用举例 上图代表6个城市间的交通网,边上的权表示公路的造价 现在要用公路把6个城市连接起来(这至少要修5条公路) 如何设计使得这5条公路的总造价最少呢?;(a);MST性质:假设G=(V,E)是一个加权连通图,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。;MST性质可以用反证法证明如下: 假设图G的任何一棵最小生成树都不包含边(u,v),显然当把边(u,v)加入到G的一棵最小生成树T中时,由生成树的定义,将产生一个含有边(u,v)的回路;最小生成树边集的存储表示;mstEdge类型定义;;Prim算法;Prim算法构造一棵最小生成树的过程;Prim算法构造一棵最小生成树的过程;Prim算法构造一棵最小生成树的过程;作答;算法的关键是如何找到连接顶点集U和顶点集V-U的最小代价边。为实现这一目的,除了需要访问标志数组visited,用以区分顶点是否已经被访问过,还需要设置一个辅助数组D,用以记录从U到V-U具有最小代价的边。 对于每个vi ∈ V-U,在辅助数组D中存在一个分量D[i]与之对应,它包括两个域: lowCost为U中的顶点到顶点vi的边上的最小权值; adjVex表示U集合中编号为adjVex的顶点与编号为i的顶点(即vi)之间的边上的权值是lowCost。 ;Prim算法--基于邻接表; for ( i= 1; i verNum; ++i) { // 选中一个点u入U集合后 for (p = verList[u].firstEdge; p != NULL; p = p-next) // 更新u关联的顶点的D值 if (!visited[p-to] D[p-to].lowCost p-weight) { D[p-to].lowCost = p-weight; // 更新lowcost D[p-to].adjVex = u; // 更新adjVex } minCost = noEdge; for (j = 0; j verNum; ++j) // 在V-U中找lowCost最小顶点u if (D[j].lowCost minCost) { minCost = D[j].lowCost; u = j; } TE[count].vex1 = D[u].adjVex; // 保存最小生成树的一条边 TE[count].vex2 = u; TE[count++].weight = D[u].lowCost; D[u].lowCost = noEdge; // 顶点u已并入U集合 visited[u] = true; } delete [] D; };时间性能;作答;;Kruskal算法;Kruskal算法;Kruskal算法构造一棵最小生成树的过程;作答;Kruskal算法;Kruskal算法--基于邻接表; while( count verNum- 1 ) { // 选出verNum-1条边 e = Q.deQueue(); // 从优先级队列出队一条边 int u = S.find(e.vex1); // 查找顶点vex1所属子集 int v = S.find(e.vex2); // 查找顶点vex2所属子集 if( u != v ) { // 边上的两个顶点不属于同一连通分量 S.merge( u, v ); //

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档