普利姆算法
求最小生成树
在所有u属于U,v属于V-U的边(u,v)属于E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。
以下图为例,构造最小生成树,如图:
构造过程中辅助数组中各分量值,如图:
代码如下:(详解见注释)
void MiniSpanTree_PRIM(MGraph G, VertexType u) {
struct {
VertexType adjvex;
VRType lowcost;//最小权值
}closedge[MAX_VERTEX_NUM];
k = LocalVex(G, u);//得u在G中的位置
for (j = 0; j < G.vexnum; ++j) {
if (j != k)
closedge[j] = { u,G.arcs[k][j].adj };
//把所有与u相邻接的点和权值都录入
}
closedge[k].lowcost = 0;//初始,U={u}。
for (i = 1; i < G.vexnum; ++i) {
k = minimum(closedge);
//找权值最小的点
printf(closedge[k].adjvex, G.vex[k]);//输出生成树的边
closedge[k].lowcost = 0;
for (j = 0; j < G.vexnum; ++j) {//更新最小边
if (G.arcs[k][j].adj < closedge[k].lowcost) {
closedge[j] = { G.vexs[k],G.arcs[k][j].adj };
}
}
}
}