主题:请教关于prim算法的问题
[em1]
书上的代码: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}
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集
[color=FF0000][color=FF00FF]for (j=0; j<G.vexnum; ++j)
if (G.arcs[k][j].adj < closedge[j].lowcost)
// 新顶点并入U后重新选择最小边
closedge[j] = { G.vexs[k], G.arcs[k][j].adj };
} // for[/color][/color]
} // MiniSpanTree
请问红色部分代码的作用是什么
假设一个连通网
[img]http://club.joyes.com/images/upload9/2006/10/30/210314.gif[/img]
假设已经加入生成树的顶点为 a ,b ,c 未选入的顶点为g f e d 则红色部分代码表示c顶点到网中各个顶点的权 与 已选入的顶点到各个顶点的权进行比较求最小的权的那条边 既然已经将c并入u集了 就说明边已经确定了 为什么还要将c与各个顶点的权拿来跟其他顶点进行比较 另外我想问下
k = minimum(closedge); 这个函数是什么意思 是如何定义?
书上的代码: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}
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集
[color=FF0000][color=FF00FF]for (j=0; j<G.vexnum; ++j)
if (G.arcs[k][j].adj < closedge[j].lowcost)
// 新顶点并入U后重新选择最小边
closedge[j] = { G.vexs[k], G.arcs[k][j].adj };
} // for[/color][/color]
} // MiniSpanTree
请问红色部分代码的作用是什么
假设一个连通网
[img]http://club.joyes.com/images/upload9/2006/10/30/210314.gif[/img]
假设已经加入生成树的顶点为 a ,b ,c 未选入的顶点为g f e d 则红色部分代码表示c顶点到网中各个顶点的权 与 已选入的顶点到各个顶点的权进行比较求最小的权的那条边 既然已经将c并入u集了 就说明边已经确定了 为什么还要将c与各个顶点的权拿来跟其他顶点进行比较 另外我想问下
k = minimum(closedge); 这个函数是什么意思 是如何定义?