给定一个带权的无向连通图,选取一个生成树,使得树上的边的权值之和最小,这就是最小生成树。
求解最小生成树的算法有两种,克鲁斯克尔算法和普里姆算法。
克鲁斯克尔算法的核心是边贪心选择。
普里姆算法的核心是顶点贪心选择。
1.克鲁斯克尔算法
基本思想:
首先将图的n个顶点看成n个独立的连通分支,将所有的边按权值的大小进行排序,然后从第一条边开始,依照边的权值递增的顺序查看
每一条边,当我们查看第k条边的时候,如果端点分别是两个不同的连通分支,那么就将这两个顶点连接起来,将其变为同一个连通分支,
如果这个第k条边的两个顶点同属于同一个连通分支,那么我们就不能将其连在一起,因为我们的树不能有环路,此时我们就应当跳过
第k条边,去查看第k+1条边。直到这个图里面只有一个连通分支,我们就得到了答案。
2.普里姆算法
说在前:MST性质
设G=(V,E)是一个连通带权图,U和V是真子集,如果(u,v)∈E,且u∈U,v∈V-U,且在这样的所有的边中,(u,v)的权值最小,那么一定存在G的
最小生成树,它的边集合中包含(u,v)这条边。
我们的prim算法的基础依据就是这个性质。
基本思想:
首先将一个顶点放入一个集合A,其他顶点自然属于另一集合V-A。
那么在这两个顶点集之间选择最小权值的边,并且将选取的这条边的不属于集合A中那个顶点添加进集合A中。直到我们的集合A就是集合V为止。
这个过程中选取的边恰好构成我们的一棵最小生成树。