最小生成树算法---Kruscal算法和Prim算法(入门)
2017-01-04 00:25
232 查看
问题描述
假设现在有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) (A⊂V )Kruscal算法
1 将边集按照权值从小到大排序
2 遍历边集选取边e
3 判断加入e是否使得A集合中结点形成回路(e连接的2个结点都已经在A中)
4 如果没形成则将e加入A中
5 重复2-4步
6 G2(V,A)即最小生成树
Created with Raphaël 2.1.0开始边集遍历完成?结束遍历边集选取边e形成回路?将e加入A集合yesnoyesno
Prime算法
1 任意选取一点加入集合A中
2 选取连接A和A之外的最小权重边加入A
3 A中包含所有结点则结束运算
4 否则重复第2步
Created with Raphaël 2.1.0开始 任意选取一点加入集合A中选取连接A和A之外的最小权重边加入AA中包含所有结点?结束yesno
区别与联系
不论是Kruscal算法还是Prim算法,都是采用了贪心的策略,Kruscal算法是对边集的操作,Prim算法是对点集的操作。Kruscal算法中,集合A是一个森林,其结点就是给定图的结点。每次加入到集合A中的安全边永远是权重最小的连接两个不同分量的边。
Prim算法中,集合A是一棵树,每次加入到A中的安全边永远是连接A和A之外 的某个结点的边中权重最小的边。
参考资料:
算法导论-Thomas H.Cormen、Charles E.Leiserson
wiki百科
相关文章推荐
- 十二、图的算法入门--(2)最小生成树---Prim算法实现
- 无向图的最小生成树算法的C程序实现代码(Prim算法)
- 最小生成树算法(类Prim算法的笨办法)
- 最小生成树算法---普里姆Prim算法
- 渣渣算法回顾---最小生成树之Prim算法
- 图论入门,Prim算法求最小生成树代价,HDOJ 1879 继续畅通工程
- zoj1586 QS Network ——最小生成树入门题_Prim算法
- POJ 3026 Borg Maze 图论 prim算法(最小生成树)+BFS算法(广度优先搜索)
- poj2349 Arctic Network ——最小生成树入门题_Prim算法
- 算法java实现--贪心算法--最小生成树问题--Prim算法
- 【算法导论】最小生成树(prim算法)
- 一步一步复习数据结构和算法基础-prim算法(最小生成树)
- 数据结构与算法16:最小生成树普利姆prim算法
- 最小生成树算法---普里姆Prim算法
- 【算法】最小生成树算法(prim算法)【原创技术】
- zoj1203 Swordfish ——最小生成树入门题_Kruscal算法
- poj1861&&zoj1542 Network ——最小生成树入门题_Kruscal算法
- 求解最小生成树的算法 prim算法(附模板)
- hdu 1233还是畅通工程 最小生成树(入门题)prim算法
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)