|
二、普里姆算法
typedef struct {
VertexType adjvex;
VRType lowcost;
}closedge[MAX_VERTEX_NUM];
假设cost(u,w)表示边(u,w)上的权值,则对于集合 V-U 中每个顶点 w,
closedge[LocateVex(G, w)].lowcost = Min{cost(u,w)|u∈U}
算法 7.9
void MiniSpanTree_PRIM( MGraph G, VertexType u,SqList&
MSTree)
{
//
G 为数组存储表示的连通网,按普里姆算法从顶点 u 出发构
// 造G的最小生成树,顺序表
MSTree 中记录生成树的各条边
k = LocateVex ( G, u );
InitList(MSTree, G.vexnum); //
初始化生成树为空树
for ( j=0; j<G.vexnum; ++j )
// 辅助数组初始化
if (j!=k) closedge[j] = { u, G.arcs[k][j].adj };//{adjvex,lowcost}
closedge[k].lowcost = 0;
// 初始状态,U={u}
for (i=1; i<G.vexnum; ++i) { //
选择其余 G.vexnum-1 个顶点
k = minimum(closedge); //
求出T的下一个结点(图中第k顶点)
// 此时closedge[k].lowcost
=
// Min{ closedge[vi].lowcost
| closedge[vi].lowcost>0, vi∈V-U }
e.vex1 = closedge[k].adjvex;
e.vex2 = G.vexs[k];
e.weight = closedge[k].lowcost;
b = ListInsert (MSTree, i, e); //
e 为生成树的一条边
closedge[k].lowcost = 0; //
第 k 顶点并入U集
for (j=0; j<G.vexnum; ++j)
if (G.arcs[k][j].adj < closedge[j].lowcost)
//
新顶点并入U后重新选择最小边
|
|
普里姆算法构造生成树的过程如动画所示。
|
|