问题:
在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得w(T) 最小,则此 T 为 G 的最小生成树。
即将给出的所有点连接起来,找出连接路径之和最小的图叫最小生成树。
解析:
PRIM算法:让一棵小树长大
简易解析:任选一点作为当前生成树的起始点,选择以该点为端点的最短边为起始边,之后,选择以该生成树中任意点为端点的最短边,注意每个新节点与生成树已有节点不重复,直到生成树包含所有节点。
图解(第一次用这工具,画小了。。。):
设计:
dist[V]=E(S,V)或正无穷
parent[S]=-1;
void Prim() {
dist[S] = 0;
while (1) {
V = 不属于当前生成树的dist最小点;
if (不存在这样的点) break;
将V收录进MST:dist[V] = 0;
for (当前点V的每个邻接点W) {
if (dist[W] != 0) {
if (E(V, W) < dist[W]) {
dist[W] = E(V, W);
parent[W] = V;
}
}
}
}
if (MST中的顶点不到 | V | 个) {
printf("生成树不存在");
}
}
由伪代码分析可得时间复杂度为
源码:
github源码地址:
https://github.com/loadin61/cuddly-memory