求最小生成树主要有两种基本的算法:
Prim算法和Kruskal算法。
Prim算法主要是着眼于顶点,而Kruskal算法主要是着眼于边。
下面介绍Prim算法的过程。
PRIM(G, s)
for u in G.V
u.key ← ∞ // u.key: 包含U的边中,最短的那条边长
u.π ← NULL // u.π : u的父节点
//初始化起始点
s.key ← 0
Q ← G.V // 将所有点插入优先队列Q中
while Q ≠ 0
u ← getMin(Q) //获取拥有最小key的点
for v in G.Adj[u] // 遍历所有与u毗邻的点
if v ∈ Q && w(u, v) < v.key //如果有更小的边出现,则刷新
v.π ← u
v.key ← w(u, v)
画图验证更容易理解~