Prim算法
算法思想:
从图中任意取出一个顶点,把他当成一棵树,然后从与这棵树相接的边中选取一条最短(权值最小)的边,并将这条边及其所连接的顶点也并入这棵树中,此时得到一棵有两个顶点的树。然后从与这棵树相接的边中,再选取最短(权值最小)的边,并将这条边及其所连顶点并入当前树,得到一棵3个顶点的树。重复操作,直到图中所有顶点并入树中,此时得到的生成树就是最小生成树。
算法步骤:
- 输入:一个加权连通图,其中顶点集合为V,边集合为E
- 初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空
- 重复下列操作,直到Vnew = V
◆ 在集合E中选取权值最小的边<u,v>
其中:u∈集合Vnew,而v≮集合Vnew
◆ 将v顶点加入集合Vnew,将<u,v>边加入集合Enew - 输出:使用集合Vnew和Enew来描述所得到的最小生成树
时间复杂度
最小边、权的数据结构 | 时间复杂度(总计) |
---|---|
邻接矩阵、搜索 | O(V²) |
图例
Prim算法的核心就是挑边,其中边的一端在Vnew集合,而另一端在V集合.
Kruskal算法
算法思想:每次找出侯选边中权值最小的边,就将该边并入生成树中,重复此过程直到所有的边都被检测完为止。
在剩下的所有未选取的边中,找最小边,如果与已选取的边构成回路,则放弃,选取次小边.
Prim算法和Kruskal算法都针对于无向图。