最小生成树之prim算法
1.问题
现有一张n个点m条边的加权无向图,向该图中取出一些边构成最小生成树(MST)。最小生成树就是用n个点n-1条边组成一个极小连通子图,要求该生成树上的边权之和最小。问这个无向图的最小生成树的权值为多少。
2.解析
prim算法的核心是贪心,始终维护这样一颗最小生成树,不断向其中加边。
大概步骤如下图:
该图为原图
此处设置起始点为1
上图中红色的边为最终的最小生成树。
3.设计
1.以某一个点开始,寻找当前该点可以访问的所有的边;
2.在已经寻找的边中发现最小边,这个边必须有一个点还没有访问过,将还没有访问的点加入我们的集合,记录添加的边;
3.寻找当前集合可以访问的所有边,重复2的过程,直到没有新的点可以加入;
4.此时由所有边构成的树即为最小生成树。
4.分析
Prim算法首先对要在最小生成树中添加n个点,所以最外层的循环从1到n,添加每个点时要更新数组d,并且找出距离最小的点,需要对每个点更新,所以prim算法的复杂度为O(V^2)。