最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~
在考研中呢,最小生成树虽然是只考我们分析,理解就行,但我们还是要知道底层是怎么实现的,话不多说,进入正题~~
什么是生成树?什么是最小生成树
总所周知,对于一个无向连通图,我们想把他看成一个树的话,那么就不能太乱,也就引出了,如果对于一个生成树(不唯一,满足条件即可),如果砍去它的一条边,则会变成非连通图,如果加上一条边则会形成一个回路,也就是包含图的全部顶点的一个极小连通子图,如下所示~~

因此,对于顶点数为n的图,生成树应含有n-1条边~~
那么,最小生成树又是什么呢?
当边带权时,我们想要一个生成树,使得带权路径和最小,那么这样的生成树就被我们称作最小生成树(不唯一),也就是边的权值之和最小的生成树(MST,Minimum-Spanning-Tree)~~
那么怎么求一个最小生成树呢?
没错,我们相求一个最小生成树,我们的前辈大牛也想过这个问题,也就引出了两个算法,一个是Prim算法(普里姆),和Kruskal算法(克鲁斯卡尔)~~
先给一个案例我们来分析一下,经典的修路~~
我们想要使得我们这个小镇全都连通,但又花费经济最少(虚线边数值代表所需金钱,也就是权值),该怎么修呢?先给出答案,接下来我们用两个算法分别分析一下思路以及底层实现~~

Prim算法(普里姆)思路分析与底层实现
Prim算法:从选取的某一个顶点开始,每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止~~
思路分析:也就是并查集内加新顶点,为了方便理解,我们把并查集每次都纳入的顶点看成一个在一个圈里加入新顶点,不属于圈里的即为连通的顶点,如图所示算法思路~~

底层实现:我们这里定义两个数组一个为isJoin[]和lowCost[]数组,isJoin[]用来标记是否已加入树,lowCost[]用来表示各节点加入当前树时的最低代价~~
如第一个步骤的时候,只有c点加入了树,那么我们就当c点已经加入了树,也就是说isJoin[6]变为了如表所示(为了方便我们把数组下标换成我们的字母abcdef)~~
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| isJoin[6] | 1 | 0 | 0 | 0 | 0 | 0 |
此时我们的lowCost[6]对应就应为(没有边直接连通则为无穷):
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| lowCost[6] | 0 | 1 | 5 | 4 | 6 | 4 |
lowCost最小为1,也就是C与A连接所需代价最小,所以当第1步结束时,我们将A连入树中,修改对应isJoin[6]和lowCost[6]~~
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| isJoin[6] | 1 | 1 | 0 | 0 | 0 | 0 |
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| lowCost[6] | 0 | 0 | 5 | 4 | 6 | 4 |
权:1~~
lowCost最小为4,也就是(D或者F)与圈AC连接所需代价最小,所以当第2步结束时,我们将F连入树中,修改对应isJoin[6]和lowCost[6]~~
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| isJoin[6] | 1 | 1 | 0 | 0 | 0 | 1 |
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| lowCost[6] | 0 | 0 | 5 | 2 | 6 | 0 |
权:1+4~~
因为现在要和圈ACF连接,D如果想代价最小就可以选择DF连接(2),而不是以前的DC连接(4),2代价更小,这就是lowCost[]用来表示各节点加入当前树时的最低代价的意思~~
重复此过程~~
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| isJoin[6] | 1 | 1 | 0 | 1 | 0 | 1 |
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| lowCost[6] | 0 | 0 | 5 | 0 | 6 | 0 |
权:1+4+2~~
接下来
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| isJoin[6] | 1 | 1 | 1 | 1 | 0 | 1 |
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| lowCost[6] | 0 | 0 | 0 | 0 | 3 | 0 |
权:1+4+2+5~~
最后
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| isJoin[6] | 1 | 1 | 1 | 1 | 1 | 1 |
| C | A | B | D | E | F | |
|---|---|---|---|---|---|---|
| lowCost[6] | 0 | 0 | 0 | 0 | 0 | 0 |
权:1+4+2+5+3=15~~
Kruskal算法(克鲁斯卡尔)思路分析与底层实现
双生关系,Prim是每次选一个连到树里代价最小的顶点构成一个树,Kruskal是每次选一条权值最小的边,使这条边两端连通(如果原本就已经连通就不选),直到所有结点都连通~~
思路分析:上图~~

底层实现:并查集~~
按权值排序~~
| weight | 1 | 2 |
|---|---|---|
| 1 | A | C |
| 2 | D | F |
| 3 | B | E |
| 4 | D | C |
| 4 | C | F |
| 5 | A | D |
| 5 | B | C |
| 6 | A | B |
| 6 | C | E |
| 6 | E | F |
依次往下看,1和2两个点是否属于同一集合(先规定所有顶点都属于不同的集合,如果两个顶点相连,则这两个顶点构成了一个集合)~~
如第一次,weight为1,A和C为不同集合,相连,通过~~(集合AC,B,D,E,F)
第二次,weight为2,D和F为不同集合,相连,通过~~(集合AC,DF,B,E)
第三次,weight为3,B和E为不同集合,相连,通过~~(集合AC,DF,BE)
第四次,weight为4,D和C虽然DF是一个集合,AC是一个集合,但DF和AC不是一个集合里的不连通,所以相连,通过~~(集合ACDF,BE)
第五次,weight为4,C和F同属于ACDF集合里,所以不相连,不通过~~(集合ACDF,BE)
第六次,weight为5,A和D同属于ACDF集合里,所以不相连,不通过~~(集合ACDF,BE)
第七次,weight为5,B和C不属于同一个集合里,所以相连,通过~~(集合ABCDEF)
至此成功~~
最小生成树还是简单的,为我们后面学习最短路径做基础,这里大家好好看看,下周我就来谈一谈最短路径的几个算法,这两者很像,但要区分开来~~
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析的更多相关文章
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- 最小生成树Prim算法和Kruskal算法
Prim算法(使用visited数组实现) Prim算法求最小生成树的时候和边数无关,和顶点树有关,所以适合求解稠密网的最小生成树. Prim算法的步骤包括: 1. 将一个图分为两部分,一部分归为点集 ...
- 最短路径问题,BFS,408方向,思路与实现分析
最短路径问题,BFS,408方向,思路与实现分析 继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~ 最短路径问题 说起这个问题,先说个 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- 最小生成树——Prim算法和Kruskal算法
洛谷P3366 最小生成树板子题 这篇博客介绍两个算法:Prim算法和Kruskal算法,两个算法各有优劣 一般来说当图比较稀疏的时候,Kruskal算法比较快 而当图很密集,Prim算法就大显身手了 ...
- 最小生成树Prim算法和Kruskal算法(转)
(转自这位大佬的博客 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html ) Prim算法 1.概览 普里姆算法(Pr ...
- hdu1233 最小生成树Prim算法和Kruskal算法
Prim算法 时间复杂度:O(\(N^2\),N为结点数) 说明:先任意找一个点标记,然后每次找一条最短的两端分别为标记和未标记的边加进来,再把未标记的点标记上.即每次加入一条合法的最短的边,每次扩展 ...
- 数据结构与算法系列----最小生成树(Prim算法&Kruskal算法)
一:Prim算法 1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Ve ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
随机推荐
- S-Trees UVA - 712
A Strange Tree (S-tree) over the variable set Xn = {x1,x2,...,xn} is a binary tree representing a ...
- Innodb中的快照读和当前读
一.前言 上篇文章记录了对MVCC的相关理解,其中有提到快照读.其实在MVCC并发控制中,读操作可以分为两类:快照读(snapshot read)和当前读(current read) 二.什么是快 ...
- 5403. Find the Kth Smallest Sum of a Matrix With Sorted Rows
You are given an m * n matrix, mat, and an integer k, which has its rows sorted in non-decreasing or ...
- ASP.NET Core 存储session取不到值
该项目是一个mvc项目,我使用session存储登录后的用户信息,然后发现登录信息存储到session正常,这个时候立马去获取也正常 但是如果我跳转到首页后,再去获取session信息,发现sessi ...
- ip协议是哪一层的协议
IP协议对应于OSI标准模型的网络层. TCP/IP: 数据链路层:ARP,RARP 网络层: IP,ICMP,IGMP 传输层:TCP ,UDP,UGP 应用层:Telnet,FTP,SMTP,SN ...
- hdu4126(MST + 树形dp
题意: 这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少. 思路:(prim+树形dp) 先跑一边 ...
- GNU C++的符号改编机制介绍(函数的名称粉碎格式解析)
转载:http://blog.csdn.net/roland_sun/article/details/43233565 众所周知,强大的C++相较于C增添了许多功能.这其中就包括类.命名空间和重载这些 ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- 子域名查询、DNS记录查询
目录 子域名信息查询 Layer子域名爆破机 subDomainBrute 利用google查询 HTTP证书查询 DNS记录查询脚本 IP转换为经纬度 利用网页获取对方经纬度信息 首先关于DNS域名 ...
- cmake VTK visual studio 2010
使用cmake在configure之后,出现了以下错误,导致编译无法进行 The C compiler "cl" is not able to compile a simple t ...