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

数据结构(mst)2.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
§7.4.2 最小生成树( Minimum Spanning Tree) 设G是连通图,G的生成树不唯一 MST:权最小的生成树,树的权是各边上的权值之和 应用 n个城市之间的通信网,可构建n(n-1)/2条线路 n个城市连通至少要n-1条线路,G的生成树是1个可行的方案 最小生成树是最经济的可行方案 MST性质-大多数算法都利用了此性质 设G=(V,E)是一连通图,U是V的真子集,若(u,v)是所有连接U和V-U的边中权最小的边(轻边),则一定存在G的一棵最小生成树包括此边。 Pf:设G的任何一棵最小生成树均不包括(u,v); 构造MST: 就是找轻边扩充到当前生成的树T=(U,TE)中 U-红点集、红边集,构成T V-白点集、白边集 紫边集-连接红点和白点的边 轻边-权最轻的紫边,或最短紫边(若权为长度):(u1,v1) 1、Prim算法 特点 当前的形成的集合T=(U,TE)始终是一棵树 T中的顶点和边均为红色 基本思想(贪心法) 设V(G)={0,1,…,n-1} 算法的每一步均是在连接红、白点集的紫边中选一轻边扩充到T(贪心),T从任意一点r开始(r为根),直至U=V为止。MST性质保证了贪心选择策略的正确性。 1、Prim算法 如何找轻边? 可能的紫边集 设红点集|U|=k, 白点集|V-U|=n-k,则可能的紫边数为:k(n-k)。 在此紫边集中选择轻边效率太低。 构造候选轻边集 构造较小的紫边集,但保证轻边在其中。 因为,?v∈白点集,从v到各红点的紫边中,只有最短的那一条才可能是轻边,所以只须保留所有n-k个白点所关联的最短紫边作为轻边候选集即可。 显然,轻边是该候选集中权最轻的边。 可以针对红点集来构造候选轻边集吗? 1、Prim算法 如何维护候选轻边集? 当把轻边(u,v)扩充至T中时, v由白点变为红点,紫边(u,v)变为红边; ∵对每个剩余白点j,边(v,j)由白变紫,此新紫边的长度可能小于白点j原来所关联的最短紫边。 ∴须调整候选轻边集,用更短的新紫边(v,j)取代原来关联于j的最短紫边。 1、Prim算法 算法梗概 PrimMST(G,T,r) { //求以r为根的MST InitCandidateSet(…); //初始化,置初始的候选轻边集,置T=({r },φ) for (k=0; kn-1; k++) { //求T的n-1条树边 (u,v)=SelectLightEdge(…); //选轻边,可能不唯一 TE=TE∪{(u,v)}; //将(u,v)涂红加入树中,白点v加入红点集 ModifyCandidateSet(…); //根据新红点v调整候选轻边集 } } 算法终止时U=V,T=(V,TE) 1、Prim算法 实例 1、Prim算法 存储结构 #define Infinity INT_MAX //表示最大整数 #define n 100 typedef int AdjMatrix[n][n]; //邻接矩阵 typedef struct { //树边 int fromvex, tovex; //起点、终点 int len; //边长度,权值 } MST[n-1]; 设邻接矩阵初值:不存在的边其权值为Infinity 1、Prim算法 算法求精-初始化 将根r涂红加入红点集U,TE=φ。 对每个白点i (0≤i ≤n-1, i≠r ), i所关联的最短紫边(r,i)的长度为G[r][i], 这n-1条最短紫边构成了初始的候选轻边集。 因为树边为空,故将T[0..n-2]全部用来存放候选轻边集。 void InitCandidateSet (AdjMatrix G, MST T, int r) { int i, k=0; for (i=0; in; i++) //依次形成白点i初始的最短紫边存放在T[k]中 if ( i != r ) { T[k].fromvex=r; //紫边起点为红点 T[k].tovex=i; //紫边终点为白点 T[k++].len=G[r][i]; //紫边边长度,权值 } } ; 1、Prim算法 算法求精-选轻边 在当前候选轻边集T[k..n-2]中,选长度最短的紫边。(Note:T[0..k-1]是红边集,T也是树,为什么针对白点构造候选集更好?) void SelectLightSet ( MS

文档评论(0)

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

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

1亿VIP精品文档

相关文档