- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最小生成树讲解 w@最小生成树 引入:为一个镇的9个村光纤铺设做设计最小生成树MST(Minimum SpannirngTree)树 任意两个顶点间有且只有一条通路生成树 包括全部顶点且连通最小 权值和最小最小生成树的MST性质及证明构造最小生成树有多种算法,其中多数算法用到了最小生成树的下列一种性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。证明:对于两个点集,有最小的权值的边(u,v),如果该图的最小生成树不包括这条边的话,那么这棵树就 不是最小生成树。我们假设任何一棵最小代价生成树都不包含(u,v),由于树都是连通图,因而必定存在其他的边联通了顶点集U和V-U,并且这样的边必须只有一条,否则便会形成回路,因为顶点集U和V-U里面各个顶点也都是连通的。那么如果我们现在把轻边(u,v)加入这个树中,那么便形成回路了,那这个时候我们把原来的联通U和V-U的边去掉,这样形成的树是比原来的那棵最小生成树的代价还要小的,因为边(u,v)是连接两个点集之间的权值最小的边。所以这棵新的树才是最小生成树,但是它包含了边(u,v),所以与假设矛盾,结论成立。第一章最小生成树算法 第1节 普里姆算法——让小树长大普里姆算法思想 1、从连通网N={V,E}中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,v),将其顶点加入到生成树的顶点集合U中。 2、以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U中。 3、如此继续下去,直到网中的所有顶点都加入到生成树顶点集合U中为止。简单证明prim算法反证法:假设prim生成的不是最小生成树1).设prim生成的树为G02).假设存在Gmin使得cost(Gmin)cost(G0) 则在Gmin中存在u,v不属于G03).将u,v加入G0中可得一个环,且u,v不是该环的最长边(这是因为u,v∈Gmin)4).这与prim每次生成最短边矛盾5).故假设不成立,命题得证.普里姆算法过程演示1 v02010v5v11617v612182619v8v2248v721716v422v32010+20+12+8+16+19+7+16=最小生成树权值iv23456UV-Ukclosedge1611151∞1∞adjvexlowcost3634adjvexlowcost15350adjvexlowcosdjvexlowcost3536000adjvexlowcost230000v1adjvexlowcost6510000055v2v3v46423v5v66Prim算法-实例起点23456{v2,v3,v4,v5,v6}{v1}31{v2, v4, v5, v6}{v1,v3}64{v1,v3,v6}{v2,v4,v5}42v1 v2 v3 v4 v5 v6{v1,v3,v6,v4}v1v2v3v4v5v62{v2, v5}5{v1,v3,v6,v4,v2}5{v5}3{v1,v3,v6,v4,v2,v5}{}普里姆最小生成树算法与dijkstra最短路径算法相同:1:同一种贪心策略,从V-U中选最小权值点加入U中不同1:应用 prim所有连通和最小 dijkstra A到其他最短路径2:prim无向 dijkstra有向3:prim V-U中与U距离最小 dijkstra V-U中与A最短,可间接程序截图:运行结果: 第2节 克鲁斯卡尔算法——森林合成树克鲁斯卡尔算法思想 1、设有一个有n个顶点的连通网N={V,E},最初先构造一个只有n个顶点,没有边的非连通图T={V, E},图中每个顶点自成一个连通分量。 2、当在E中选到一条具有最小权值的边时,若该边的两个顶点落在不同的连通分量上,则将此边加入到T中;否则将此边舍去,重新选择一条权值最小的边。 3、如此重复下去,直到所有顶点在同一个连通分量上为止。简单证明Kruskal算法对图的顶点数n做归纳,证明Kruskal算法对任意n阶图适用。归纳基础:n=1,显然能够找到最小生成树。归纳过程:假设Kruskal算法对n≤k阶图适用,那么,在k+1阶图G中,我们把最短边的两个端点a和b做一个合并操作,即把u与v合为一个点v,把原来接在u和v的边都接到v上去,这样就能够得到一个k阶图G(u,v的合并是k+1少一条边),G最小生成树T可以用Kruskal算法得到。我们证明T+{u,v}是G的最小生成树。用反证法,如果T+{u,v}不是最小生成树,最小生成树是T,即W(T)W(T+{u,v})。显然T应该包含u,
文档评论(0)