最小生成树之Prim(普里姆)算法
关于什么是Prim(普里姆算法)?
在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网,
则连通n个城市仅仅须要n-1条线路。这时。我们须要考虑这样一个问题。怎样在最节省经费前提
下建立这个通信网.换句话说,我们须要在这n个城市中找出一个包括全部城市的连通子图,使得
其全部边的经费之和最小. 这个问题能够转换为一个图论的问题:图中的每一个节点看成是一个城市,
节点之间的无向边表示修建该路的经费。即每条边都有其对应的权值,而我们的目标是挑选n-1条
边使全部节点保持连通。而且要使得经费之和最小.
这里存在一个显而易见的事实是: 最优解中必定不存在循环(可通过反证法证明). 因此。最后找
出的包括全部城市的连通子图必定没有环路。
这样的连通且没有环路的连通图就简称为树。而在一个
连通图中删除全部的环路而形成的树叫做该图的生成树.对于城市建立通信连通网。须要找出的树由
于具有最小的经费之和。因此又被称为最小生成树(Minimum Cost Spanning Tree),简称MST.
基本思路?
因为生成树必须包括原图里面的全部节点。关键的问题就在于边的选择,怎么才干找出n-1条边,
使得全部节点连通。而且权重最小呢? 这里。我们先来看看MST有什么特点设有上图所看到的的最小生
成树T,假设删除边(u,v)∈T,则T将被分解成两个子树:T1和T2,因此。T1和T2各自是其所包括节点的最
小生成树。此处可用反证法证明:如果T1(也可如果为T2)不是其所包括节点的最小生成树。那么,势必
还存在的生成树T',那么,T'+w(u,v)+T2<T1+w(u,v)+T2。这与我们的如果T是最小生成树相矛盾,
故结论成立.
这就是最小生成树的最优子结构性质。在细想一下,MST也包括了重叠子问题的性质,那么似乎我们
能够用动态规划来解决.但假设用动态规划来解决MST,其时间复杂度是指数级别的。显然不是太可取,
我们须要找寻更好的方法.既然MST满足最优子结构性质,那么它是否满足贪婪选择属性呢?
为了更好地理解最小生成树请看例如以下的样例:
增加一个地区有9个城镇,镇长要求你把这九个城镇联通起来,可是要求消耗最少,就是走的路最少。
如图:
代表九个城镇。而且相邻城镇之间的道路消耗已经标了出来,要求联通全部消耗最好。
那么能够得到例如以下几种情况:
1.
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
总消耗:=11 + 26 + 20 + 22 + 18 + 21 + 24 + 19 = 161
2、
总消耗:=8+12+10+11+17+19+16+7= 100
3、
总消耗:=8+12 + 10+11 +16 +19 + 16 +7 = 99
综上三图可知最后一个以微小的差距赢了第二个。
这样的就叫做最小生成树。
对于Prim的算法:
设图G=(V,E),U是顶点集V的一个非空子集。假设(u,v)是一条具有最小权值的边。当中u∈U,v∈V-U,
则必存在一棵包括边(u,v)的最小生成树.
上述的性质能够通过反证法证明。假设(u,v)不包括在G的最小生成树T中。那么,T的路径中必定存
在一条连通U和V-U的边,假设将这条边以(u,v)来替换,我们将获得一个权重更低的生成树,这与T
是最小生成树矛盾.既然MST满足贪婪选择属性。那么。求解最小生成树的问题就简化了非常多。
总结一下,详细的步骤大概例如以下:
构建一棵空的最小生成树T,并将全部节点赋值为无穷大.
- 构建一棵空的最小生成树T。并将全部节点赋值为无穷大.
- 任选一个节点放入T。另外一个节点集合为V-T.
- 对V-T中节点的赋值进行更新(因为此时新增加一个节点,这些距离可能发生变化)
- 从V-T中选择赋值最小的节点,增加T中
- 假设V-T非空,继续步骤3~5,否则算法终结
最小生成树之Prim(普里姆)算法的更多相关文章
- 经典问题----最小生成树(prim普里姆贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
- MST最小生成树及Prim普鲁姆算法
MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而 ...
- 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...
- 查找最小生成树:普里姆算法算法(Prim)算法
一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...
- ACM第四站————最小生成树(普里姆算法)
对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...
- 图->连通性->最小生成树(普里姆算法)
文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可 ...
- 普里姆算法(Prim)
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(带权图)里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权 ...
- HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- Prim算法(普里姆算法)
描述: 一个连通图的生成树是指一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的 n-1 条边.我们把构造连通网的最小代价生成树成为最小生成树.而Prim算法就是构造最小生成树的一种算法. ...
- 最小生成树练习3(普里姆算法Prim)
风萧萧兮易水寒,壮士要去敲代码.本女子开学后再敲了.. poj1258 Agri-Net(最小生成树)水题. #include<cstdio> #include<cstring> ...
随机推荐
- 程序异常退出 却没有产生core文件
程序异常退出 却没有产生core文件 http://www.cnblogs.com/my_life/articles/4107333.html
- npm编译报错,缺少组件
解决方式: 1.删除安装文件 node_modules: 2.在需要安装 node_modules 文件的文件夹中,打开命令窗口,输入: cnpm install: 3.再输入: npm start, ...
- BAT 前端开发面经 —— 吐血总结
更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘,在此总结一下 一是备忘.总结提升,二是希望给大家一些参考 其他面试及基础相关可以参考其他博文: ...
- django使用celery进行耗时任务的优化
# 原创,转载请留言联系 在用django做项目的时候,做到注册模块时,需要发送短信验证码.本来简简单单的做好了,后来优化的时候发现,发送短信验证码的时候需要一点时间,在这个时间之内程序是阻塞的,用户 ...
- python中进程池的应用
#原创,转载请联系 假设我们写的一个程序需要运行100个子进程的时候,那么写程序时,不可能循环创建销毁100个进程吧?进程的创建与销毁是很耗系统的资源的. 进程池的作用就体现出来了. 进程池可以控制进 ...
- Solidity 文档--第一章:智能合约入门
一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; f ...
- 我从没理解js的闭包,直到他人向我这么解释。。。
前段时间根据执行上下文写过一次闭包,但是写的简陋些.昨天在twitter上看到这篇文章,感觉背包的比喻挺恰当的.所以就翻译了. 这篇文章有些啰嗦,但是讲解很细,希望还是耐心看完.也欢迎指出错误. 原地 ...
- 详解Oracle数据货场中三种优化:分区、维度和物化视图
转 xiewmang 新浪博客 本文主要介绍了Oracle数据货场中的三种优化:对分区的优化.维度优化和物化视图的优化,并给出了详细的优化代码,希望对您有所帮助. 我们在做数据库的项目时,对数据货场的 ...
- eclispe新导入的文件有个小红叉号(x)的问题
关于这个问题,我百度了很久,后面发现很简单的就解决了:我觉得可能大家的问题不一样,或许解决方法可能是一样的: 参考链接:https://zhidao.baidu.com/question/616762 ...
- HDU 2050 折线分割平面(转)
折线分割平面 http://acm.hdu.edu.cn/showproblem.php?pid=2050 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微 ...