【数据结构】最小生成树之prim算法和kruskal算法
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种。看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解。
比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优的问题,怎样修才是做好的,如下图:第一个是网全图,后三个图的修路方案都可以
1.树的定义:有n个顶点和n-1条边,没有回路的称为树
生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是生成树
最小:指的是这些边加起来的权重之和最小
2.判定条件:向生成树中任加一条边都一定构成回路
充分必要条件:最小生成树存在那么图一定是连通的,反过来,图是连通的则最小生成树一定存在
3.和最小生成树有关的两个算法:prim算法和kruskal算法
a)prim算法——让小树慢慢长大型算法
按照树的定义,一个顶点就是一棵树。
原理:
1)我们选择一个顶点,也就是选择了一个树。
2)向外找权重最小的边,这样这棵树就有了两个顶点
3)再以这两个顶点向外找权重最小的边,依次循环,知道所有顶点收到树里
举例:
第一步:选择V1作为顶点
第二步:对比一下与V1相连的各条边的权重,选择最小的V1-V4这条边
第三步:以V1和V4为树,向外找权重最小的边,这时就有了V1-V2,V4-V3两条边,这样就把顶点V2和V3收进了树里。
接着以V1,V2,V3,V4为顶点的树,向外选权值最小的边,注意不能构成回路。依次循环,这样就选择了V4-V7,V7-V5,V7-V6这三条边
数一下现在已经包含了全部的7的顶点,和6条边了,这样最小生成树就长大了
b)kruskal算法——将森林合并为树
原理:
1)和prim算法不一样的是,kruskal算法先选择权重最小的边(因为一个顶点就是一棵树,那么一个边两个顶点就可以看成是一棵树)
2)接着选择剩下的权值比较小的边,注意不能形成回路,只到包含全部顶点
举例:
还是上面那幅图
第一步:先选择V1-V4,V6-V7两条权值为1的边
第二步:选择V4-V3,V1-V2两条权值为2的边。接着不能选择V4-V2权值为3的边,这样就构成了回路,只能选择V4-V7权值为4的边。
同理不能选择V6-V5权值为5的边,因为会构成回路,只能选择V7-V5权值为6的边。
此时就已经包含了全部的7的顶点,和6条边了,这样最小生成树就从森林变成了树
【数据结构】最小生成树之prim算法和kruskal算法的更多相关文章
- 最小生成树之Prim算法和Kruskal算法
最小生成树算法 一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决. Prim算法 ...
- java实现最小生成树的prim算法和kruskal算法
在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...
- 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)
最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...
- 最小生成树(prim算法和kruskal算法)
学习博客:https://www.cnblogs.com/zhangming-blog/p/5414514.html 其实就是加点法:从不属于这个集合的点中找从本集合可以找到的最小边,加入本集合 看代 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- 最小生成树——Prim算法和Kruskal算法
洛谷P3366 最小生成树板子题 这篇博客介绍两个算法:Prim算法和Kruskal算法,两个算法各有优劣 一般来说当图比较稀疏的时候,Kruskal算法比较快 而当图很密集,Prim算法就大显身手了 ...
- 最小生成树Prim算法和Kruskal算法
Prim算法(使用visited数组实现) Prim算法求最小生成树的时候和边数无关,和顶点树有关,所以适合求解稠密网的最小生成树. Prim算法的步骤包括: 1. 将一个图分为两部分,一部分归为点集 ...
- Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...
- Prim算法和Kruskal算法的正确性证明
今天学习了Prim算法和Kruskal算法,因为书中只给出了算法的实现,而没有给出关于算法正确性的证明,所以尝试着给出了自己的证明.刚才看了一下<算法>一书中的相关章节,使用了切分定理来证 ...
随机推荐
- C# -- 泛型(2)
通过前面的文章我们知道“泛型”是个“形容词”,并且了解了 “泛型类” 和 “泛型数组” ,下面我们来看看泛型的其它的使用方式. 上一篇:C# -- 泛型(1) <1>.泛型方法 上一篇文章 ...
- 简单好用的表单校验插件——jQuery Validate基本使用方法总结
jquery validate当前最新版本是1.17.0,下载链接是:https://github.com/jquery-validation/jquery-validation/releases/t ...
- Android getDimension,getDimensionPixelOffset,getDimensionPixelSize
1.例如在onMeasure(int , int)方法中可能要获取自定义属性的值.如: TypedArray a = context.obtainStyledAttributes(attrs, R.s ...
- SOA-WebService
一.创建Web服务方法 在项目上右击选择新建项>>Web服务(ASMX),并命名,如MyWebService.asmx 二.注意事项 所有需要外界调用的方法上端均需增加特性[WebMeth ...
- SQL server T-sql语句查询执行顺序
前言 数据库的查询执行,毋庸置疑是程序员必备的技能之一,然而数据库查询执行的过程绚烂多彩,却是很少被人了解,今天我们来深入了解下sql查询的来龙去脉,为查询的性能优化打个基础 这篇博客,摒弃查询优化性 ...
- 基于任务的异步编程模式(TAP)的错误处理
在前面讲到了<基于任务的异步编程模式(TAP)>,但是如果调用异步方法,没有等待,那么调用异步方法的线程中使用传统的try/catch块是不能捕获到异步方法中的异常.因为在异步方法执行出现 ...
- Object C语法学习笔记(二)
1.@property与@synthesize配对使用. @property预编译指令的作用是自动声明属性的setter和getter方法. @synthesize 创建了该属性的访问代码 功能:让编 ...
- 关于windows上 web 和 ftp 站点的创建及使用
关于windows上 web 和 ftp 站点的创建及使用 引言 其实这是我网络基础课上的一次作业,觉得挺实用的,遂写成博客分享,也算是对这次作业的一次总结. 实验目的 通过此实验掌握WEB和FTP站 ...
- loj #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...
- C#/ASP.NET对URL中的中文乱码处理
前言:UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节. 不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节. 1.直接在C#后台编码URL参数 引用类库:System. ...