04-最小生成树问题分解.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最小生成树 对于一张图进行深度优先搜索或者广度优先搜索,可生成一棵搜索树。搜索的出发点不同,生成树的形态亦不同。 在一张带权的无向连通图中,各边权和为最小的一棵生成树即为最小生成树。 应用举例 已知某乡管辖的村庄都是有路可通的,且相邻村庄间公路的长度已知。现在要沿公路架设电线,使各村之间都通电话,问应该怎样架线才能使所用的电线最少。 最小生成树的计算策略 计算最小生成树采用的是贪心策略,即必须保证每次添加的边同时满足下述两个条件: (1)不能形成回路; (2)在保证条件1的前提下添加权尽可能小的边,这样的边称之为安全边。 Kruskal算法 初始时,森林是由单个节点组成的n棵树。然后反复找出森林中连接任意两棵树的所有边中具有最下权值的边(u,v),将其作为安全边,把它添加到正在生长的森林中,直至产生最小生成树为止。 1 2 3 4 5 6 7 8 Kruskal算法思路 设节点数n,边数为m;所有边按照权值递增的顺序排列成边集e,其中第i条边为(e[i].x,e[i].y),该边的权为e[i].c;并查集为f,其中f[i]为节点i所在并查集的代表节点,即子树根。主算法如下: procedure kruskal{ qsort(1,n);//按照边权值递增的顺序排序边集e for i:=1 to n do f[i]:=i;//并查集,初始化每棵树 for i:=1 to m do union(e[i].x,e[i].y,e[i].c) } procedure union(i,j,c:longint); var x,y:longint; { x:=getfather(i);y:=getfather(j); if xy then {inc(ans,s);f[y]:=x;} } function getfather(i:longint):longint; { if if[i] then f[i]:=getfather(f[i]); exit(f[i]); } Kruskal算法总运行时间为O(ElnE),算法效率取决于边数E,适用于稀疏图。 kruskal P1442 繁忙的都市 P1352 Kerry 的电缆网络 P1470 口袋的天空 P1374 新年趣事之游戏 POJ 2421 Constructing Roads POJ 1861 Network POJ 3522 Slim Span POJ 1679 The Unique MST Prim算法 Prim算法执行过程中,集合A中的边总是只形成单棵树。初始时,A为空。接下来每次添加到A的边都是使树的边尽可能小的边,这个过程一直进行到不存在连接生成树的边为止。 Prim算法思路 设r为出发节点,w[i,j]为边(i,j)的权。若图中不存在边(i,j),则w[i,j]=∞。ans为最小树的和,d[i]为生成树外节点i与生成树相连的最短边长,即d[i]=min{w[i,j]}(i不属于最小生成树t,j属于最小生成树t),简称节点i的距离值。 在算法执行过程中,所有不在树中的节点按照d值递增的顺序组成一个优先队列;f[u]为树中u节点的父母。 Procedure MST_Prim; {for each v∈G(v) do {d[v]:=∞;f[u]:=nil}; d[r]:=0;Q:=G(v); while Q∮ do{ 在队列Q中取出一个d值最小的节点u; if ur then ans:=ans+w[u,f[u]]; for each v∈adj[u] do if (v∈Q) and (w[u,v]d[v]) then {f[v]:=u;d[v]:=w[u,v];} } 输出最小生成树的权和ans; } Prim算法的整个运行时间为O(VlnV+ElnV)。上限为O(VlnV+V2lnV)。Prim算法的效率取决于节点数V,一般使用于稠密图。 void Prim() { int d[Max],VexSet[Max],v; int i,j,k,min; ? for(i=0;ig.n;i++) ? { d[i]=g.edges[v][i]; VexSet[i]=0;}? ?VexSet[v]=1;? sum=0; for(i=0;ig.n;i++) { min = INF; for(j=0;jg.n;j++) {if(VexSet[j]==0d[j]min){ min = d[j]; k=j; } } VexSet[k]=1; v=k;

文档评论(0)

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

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

1亿VIP精品文档

相关文档