Prim算法的思想是,
从已有树边的顶点集U上选取一点u,再从未被生成树选中的顶点集U-V中选择一点v,使得(u,v)的权值最小,则将(u, v)加入生成树的边集T上,将v加入生成树的顶点集U,直到所有顶点都被生成树选中,则生成树都走完毕。
Prim算法流程:
1.U = {u0}, T={};
2.While(U≠V) do
(u, v) = min{w(i, j); i∈U, j∈V-U}
T = T∪{(u, v)}
U = U∪{v}
3.End
实现技巧,
U, V-U可用一个位向量表示。
1.[代码]Prim
% 生成图G的 最小生成树的 边表
function MST = Prim_algo(G)
N = length(G); % 图G的顶点数
MST = []; % 记录MST的边表 [u v w]
k = 0;
vis = zeros(1, N);
vis(1) = 1;
while k < N-1
minw = inf;
u = 0; v = 0;
% 找一条最小边
for i = [1 : N]
for j = [1 : N]
if vis(i) == 1 && vis(j) == 0
if G(i, j) < minw
minw = G(i, j);
u = i; v = j;
end
end
end % for j
end % for i
% 加入生成树
vis(v) = 1;
k = k+1;
MST(k, :) = [u v minw];
%uvw = [u v minw] % 打印本次选出的最小边
end