实际问题
小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A、B、C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这两条道路连通的)。
Kruskal算法解决方案
基本思想
将图的n个顶点看作n个分离的部分树,每个树具有一个顶点,算法的每一步就是选择连接两个分离树
的具有最小权值的边
,将两个树合二为一,直到只有一个树为止(进行n-1
步)得到最小生成树。
如何使用Kruskal解决上述问题
实际上城市就是顶点,城市之间建造道路所需要的花费就是顶点之间的权重
Kruskal实际上就是一个贪心算法,每次都选取花费最少的道路进行修建,当然前提就是不会构成环路
示例演示
边权信息如下图
基于Kruskal的操作即为
- 先选取顶点1-4的边,权值为1
- 接着去顶点4-5的边,权值为3
- 接下来本来应该去顶点1-5的边,但是由于会构成环,所以不选取
- 接着选取顶点2-3的边,权值为6
- 接着选取顶点2-5的边,权值为7,最小生成树构成。
最后结果就变成了