带你理解MST性质
写在前面
最小生成树的引出
假设要在n个城市之间建立通信联络网,则连通n个城市需要n-1条线路。在这种情况下,我们自然需要考虑一个问题,如何在最节省经费的条件下建立这个网络?
很自然地我们会想到,将各个城市之间的线路开销转化为权重,要想找到最节省经费的方案,就需要找到能够连通所有城市且权重最小的连通线路。
因此,我们需要选择一颗生成树,使得该生成树总耗费最小,也就是用最小的代价构建这条连通网。我们称这样的网络为:最小代价生成树(简称:最小生成树)。
本文结构
本文从MST性质的定义和证明方面为读者解度最小生成树两个常见算法的前置理论性质。
普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法都是利用了MST性质的算法
建议读者在在理解了普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法之后再阅读此文
利用得到的最小生成树在回过头来理解MST会更加简单。
MST性质
MST性质的定义
假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。
若(u,v)是一条既有最小权值(代价)的边,其中u∈U,v∈V,则必存在一颗包含边(u,v)的最小生成树。
证明
证明方法
可以用反证法证明。假设网N的任何一颗最小生成树都不包含(u,v)。设T是连通网上的一颗最小生成树,当将边(u,v)加入到T中时,由生成树的定义,T中必存在一条包含(u,v)的回路。
另一方面,由于T是生成树,则在T上必存在另外一条(u',v'),其中u'∈U,v'∈V-U,且u与u',v与v'均有路径相通。
删去边(u',v')即可消除上述回路,同时得到另外一颗生成树T'。因为(u,v)的代价不高于(u'v'),则T'的代价亦不高于T,T'是一颗包含(u,v)的最小生成树。与假设假设矛盾。
举个例子
现在,给出一个连通图:
众所周知,这样一给连通网的最小生成树为:
那么可以按照如下方式对MST进行证明:
带你理解MST性质的更多相关文章
- 一个故事带你理解if __name__ == '__main__'
如果你刚刚接触python,相信会在看别人的程序的时候会遇到if __name__ == '__main__'酱紫的语法,如果当时没看懂现在也一知半解的话,看下去,本文可以帮你解决这个问题. 大家都知 ...
- JDK1.8源码逐字逐句带你理解LinkedHashMap底层
注意 我希望看这篇的文章的小伙伴如果没有了解过HashMap那么可以先看看我这篇文章:http://blog.csdn.net/u012403290/article/details/65442646, ...
- [转帖]从零开始入门 K8s | 手把手带你理解 etcd
从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...
- 手摸手带你理解Vue的Computed原理
前言 computed 在 Vue 中是很常用的属性配置,它能够随着依赖属性的变化而变化,为我们带来很大便利.那么本文就来带大家全面理解 computed 的内部原理以及工作流程. 在这之前,希望你能 ...
- 手摸手带你理解Vue的Watch原理
前言 watch 是由用户定义的数据监听,当监听的属性发生改变就会触发回调,这项配置在业务中是很常用.在面试时,也是必问知识点,一般会用作和 computed 进行比较. 那么本文就来带大家从源码理解 ...
- 转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码
上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的 ...
- 手把手带你理解style
在写代码的时候,经常遇到自定义的style,有的用来设置属性,有的用来设置主题,搞的自己云里雾里,因此在心底暗暗发誓,等到空闲的时候,一定好好学学android中的style的究竟是个什么东西,到底有 ...
- 从底层带你理解Python中的一些内部机制
下面博文将带你创建一个字节码级别的追踪API以追踪Python的一些内部机制,比如类似YIELDVALUE.YIELDFROM操作码的实现,推式构造列表(List Comprehensions).生成 ...
- 带你玩转Visual Studio——带你理解多字节编码与Unicode码
目录(?)[-] 多字节字符与宽字节字符 char与wchar_t string与wstring string 与 wstring的相关转换 字符集Charcater Set与字符编码Encoding ...
随机推荐
- jquery 设置django全局token
通过JQUEYR中的ajaxSetup,来设置django中的token,即不需要再每次都去引用: 第一步: 先django中的html中设置 {% csrf_token %} 第二步: 新一个js ...
- 『GoLang』反射
方法和类型的反射 反射是应用程序检查其所拥有的结构,尤其是类型的一种能.每种语言的反射模型都不同,并且有些语言根本不支持反射.Go语言实现了反射,反射机制就是在运行时动态调用对象的方法和属性,即可从运 ...
- 深入浅出WPF-01.WPF缘起
WPF缘起 自2012年起,根据公司需要,开始进入界面开发工作.公司是医疗器械行业,很多操作都是基于PC进行的,所以桌面应用开发尤为重要.原有项目都是基于MFC进行的开发,而且是VC6.0的技术,维护 ...
- python自定义翻页配置
1.创建pager.py文件,针对翻页进行函数书写 class PageInfo(object): # current_page 当前页数 # all_count 所有行 # per_page 每页的 ...
- 运行WampServer提示计算机中丢失 msvcr110.dll
在第一次运行WampServer的时候,出现"无法启动此程序,因为计算机中丢失 MSVCR110.dll.尝试重新安装该程序以解决此问题. 在浏览器的地址栏里输入 http://ww ...
- SpringBoot入门08-整合Mabatis
整合所需的依赖 注解方式和映射文件方式的mybatis都可以被整合进springboot 创建springboot的web项目后,在pom加入spring-mybatis和mysql-jdbc和thy ...
- FastAPI 学习之路(六)查询参数,字符串的校验
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- Redis大集群扩容性能优化实践
一.背景 在现网环境,一些使用Redis集群的业务随着业务量的上涨,往往需要进行节点扩容操作. 之前有了解到运维同学对一些节点数比较大的Redis集群进行扩容操作后,业务侧反映集群性能下降,具体表现在 ...
- Spring框架访问数据库的两种方式的小案例
1.1 以Xml的方式访问数据库的案例 要以xml的方式访问数据库需要用到JdbcTemplate ,因为 JdbcTemplate(jdbc的模板对象)在Spring 中提供了一个可以操作数据库的对 ...
- 树莓派4B学习札记
防静电 树莓派比较容易被静电损坏,要做好以下预防措施 使用的时候不要用手去触摸PCB和针脚!特别是上电之后! 拿板卡的时候,要习惯性拿板卡的边缘 勤洗手,勤摸墙壁,释放身上的静电 系统安装 8GB以上 ...