321 字
1 分钟
Prim和Kruskal算法
Prim和Kruskal算法
最小生成树
定义:
在阅读下列内容之前,请务必阅读 图论相关概念 与 树基础 部分,并了解以下定义:
- 生成子图
- 生成树
我们定义无向连通图的 最小生成树(Minimum Spanning Tree,MST)为边权和最小的生成树.
Eg:只有连通图才有生成树,而对于非连通图,只存在生成森林. 最小生成树的边数等于顶点数减1.
Prim算法
Prim(普利姆)算法:每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。

Eg:一个原无向图可以有多个最小生成树
Prim算法实现(伪代码)
void Prim(G, T) { T = ∅; // 初始化空生成树 U = { w }; // 任选一顶点 w 加入集合 U
while (V - U ≠ ∅) { // 若树中不包含全部顶点 设 (u, v) 是连接 U 与 V−U 的最小权边(u ∈ U, v ∈ V−U); T = T ∪ {(u, v)}; // 边入树 U = U ∪ {v}; // 点入树 }}Kruskal算法
Kruskal(克鲁斯卡尔)算法:每次将代价最小的边(已连通的不加入)纳入生成树,直到所有顶点都连通为止。

Eg:一个原无向图可以有多个最小生成树
Kruskal算法实现(伪代码)
void Kruskal(V, T) { T = V; numS = n; // 连通分量数 while (numS > 1) { // 若连通分量大于1 从E中取出权值最小的边 (v, u) ; if(v和u属于T中不同的连通分量){ T = T ∪ {(v, u)}; // 边入树 numS--; } }}Prim和Kruskal算法区别
Prim更适用于稠密图,即边多的图。
Kruskal更适用于稀疏图,即点多的图。
动画演示
Prim和Kruskal算法
https://yubendan.com/posts/ds/prim和kruskal算法/ 部分信息可能已经过时









