文章链接: prim算法精讲、 kruskal算法精讲
题目链接: 53. 寻宝
最小生成树
最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。
prim算法
prim三部曲
第一步,选距离生成树最近节点;
第二步,最近节点加入生成树;
第三步,更新非生成树节点到生成树的距离(即更新minDist数组)。
动画演示见B站视频:【最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示】 https://www.bilibili.com/video/BV1Eb41177d1?vd_source=65a224d3f97ae5a1002c0964faf8a876
kruskal算法
与prim算法的区别:
prim 算法是维护节点的集合,而 Kruskal 是维护边的集合。
思路:
第一步:边的权值排序,因为要优先选最小的边加入到生成树里;
第二步:遍历排序后的边:
- 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环;
- 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合。
(判断是否成环:用并查集)
动画演示见B站视频:【最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示】 https://www.bilibili.com/video/BV1Eb41177d1?vd_source=65a224d3f97ae5a1002c0964faf8a876
总结:
Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 Kruskal 维护的是边的集合。 如果 一个图中,节点多,但边相对较少,那么使用Kruskal 更优。
所以在 稀疏图中,用Kruskal更优。 在稠密图中,用prim算法更优。
Prim 算法 时间复杂度为 O(n^2),其中 n 为节点数量,它的运行效率和图中边树无关,适用稠密图。
Kruskal算法 时间复杂度 为 nlogn,其中n 为边的数量,适用稀疏图。