最小生成树算法---Kruscal算法和Prim算法(入门)
来源:互联网 发布:手机淘宝首页大图尺寸 编辑:程序博客网 时间:2024/06/05 06:27
问题描述
假设现在有n个城市,我们要在城市之间修路,使得我们无论从哪一个城市出发,都能通过某种路线到达另一个城市。在不同的城市之间修路,所需费用也不同,求如果要使得每个城市之间连通,最少的花费是多少。
假设城市是结点,结点间的连线的权重就是费用,我们要求的最小花费所选取的边和所有的结点所构成的就是最小生成树。
算法描述
最小生成树的唯一性
最小生成树不一定是唯一的。
如图下图1,图2,红色的边连接的结点所构成的两种树都是最小生成树。
图1
图2 Kruscal的算法过程
采用贪心的策略,每次从所有边中选取最小的边,限制条件是加入这条边后不能使当前的结点形成回路。
下面图3-图11是Kruscal算法的选取边的过程。
图3
图4
图5
图6
图7
图8
图8
图10
图11 Prim算法过程
同样是采用贪心的策略,第一步任意选取一个结点加入集合A,选择边的时候,选择连接A和其余不再A中点的最小权重的边(和Dijkstra单源最短路算法类似)。
下面图12-图20是采用Prime算法的生成过程。图12
图13
图14
图15
图16
图17
图18
图19
图20
算法实现
假设G1(V,E)图中的最小生成树是G2(V,A) (
- Kruscal算法
1 将边集按照权值从小到大排序
2 遍历边集选取边e
3 判断加入e是否使得A集合中结点形成回路(e连接的2个结点都已经在A中)
4 如果没形成则将e加入A中
5 重复2-4步
6 G2(V,A)即最小生成树
- Prime算法
1 任意选取一点加入集合A中
2 选取连接A和A之外的最小权重边加入A
3 A中包含所有结点则结束运算
4 否则重复第2步
区别与联系
不论是Kruscal算法还是Prim算法,都是采用了贪心的策略,Kruscal算法是对边集的操作,Prim算法是对点集的操作。
Kruscal算法中,集合A是一个森林,其结点就是给定图的结点。每次加入到集合A中的安全边永远是权重最小的连接两个不同分量的边。
Prim算法中,集合A是一棵树,每次加入到A中的安全边永远是连接A和A之外 的某个结点的边中权重最小的边。
参考资料:
算法导论-Thomas H.Cormen、Charles E.Leiserson
wiki百科
1 0
- 最小生成树(prim和kruscal算法)
- 最小生成树算法---Kruscal算法和Prim算法(入门)
- 最小生成树的prim算法和kruscal算法
- kruscal最小生成树算法
- 最小生成树-Kruscal算法
- 算法基础 - 最小生成树(Kruscal算法)
- 最小生成树(Prim和Kruscal)
- 最小生成树(Prim算法和Kruskal算法)
- 算法导论--最小生成树(Kruskal和Prim算法)
- Prim算法和Kruskal算法(最小生成树)
- 最小生成树-Prim算法和Kruskal算法(转)
- 最小生成树-Prim算法和Kruskal算法(转)
- 图的邻接矩阵表示形式,DFS和BFS,最小生成树Prim和Kruscal,单源最短路径Dijkstra算法
- 最小生成树算法 :Prim算法 和 Kruskal 算法
- 最小生成树算法—Kruskal算法和Prim算法
- 最小生成树之kruscal算法
- 最小生成树 Kruscal算法--poj 2377
- kruscal算法求最小生成树总结
- 洛谷 P1002 过河卒
- 简单的按键控制LED
- linux学习笔记--cut命令
- caffe+cuda编程
- 按键控制LED实现启动、停止按钮
- 最小生成树算法---Kruscal算法和Prim算法(入门)
- java操作Excel文件
- 7.C3P0
- 02_线性表的链式表示和实现
- Web基础知识五之Html表单标记
- 知识库--StandardService + Lifecycle(start/stop)+initialize(72)
- VMware 虚拟机如何连接网络
- Mac OS X 下 su 命令提示 sorry
- 8.Session的一级缓存