连通图才有生成树,所以假定图是连通的。而且对于任意一个点作为树根,都能见一颗最小生成树,所以最小生成树在形式上不是唯一的。
prim算法:
实现:设T为生成树的子图,不断选取T连接剩下点集的最短边。
证明:设T为生成树的子图,设e为所说的最短边,假设不连e边,连其他任意边f,我们都可以通过删除f连e边建立一个新的树,树的总权值只会更小。
用堆维护。实现起来很简单就不帖代码了。
kruskal算法:
实现:把所有边的权值排序一遍,只要不产生圈加入就行。
证明:很显然是对的。
如何判圈:并查集判连通分量。
为什么最终这些“零散的边”能形成一棵树?假设点的总数是V个我们选择了V-1条不带圈的边,那就是一个不带圈的连通图,自然会形成一棵树(只能这么说);
算法复杂度主要在于排序和并查集的维护具体不好估计反正和prim差不多。