数缺形时少直观,形缺数时难入微。
——华罗庚
序
最小生成树问题是我在各项图论问题中最先理解与解决的,其目的就是在连通图中选择出:
使得各点构成联通的最小边权的边集
其中用到的数据结构与算法也是相对很好理解的并查集和Kruskal算法,我在我之前的文章
小话数据结构-图 (聚焦与于实现的理解)
也有提到过,现在再来系统的阐述一下这问题的解决思路。
并查集
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。
并查集是一个写法简单,经常使用到的数据结构,主要操作有以下三种
初始化操作
int
查找函数
int
合并操作
p
并查集还可以维护每一个子集的大小、或是自子集到祖宗节点的距离,给出以下代码,只是使用Kruskal算法只需要使用朴素的并查集就可以了。
int
Kruskal算法【O(mlogm)】
这个顶着一个高端名字的针对解决最小生成树的算法,也就是一个彻头彻尾的贪心思想的算法,基本的步骤如下
①:将所有边按照权值从小到大排序
②:将所有边依次放入图中,如果没有连入新的点,则丢弃不要。
③:当整个图联通时,返回结果
这里给出一张别人博客里非常直观的动图
在②步骤中,并查集就可以发挥出其作用,快速的判定出当前选择的边的点是否在一个集合中,从而方便的实现算法。
那我们直接用代码来实现:
int
至此,kruskal算法就成功实现了,可以根据实际情况改变部分参数,从而获得需要求解的部分。
希望我的抛砖引玉能引起更多的思考 !