struct
{
VertexType adjvex; //U集中的顶点序号
VRType lowcost; //边的权值
}closedge[MAX_VERTEX_NUM];
int LocateVex(MGraph G,VertexType v)//返回点v在G.vexs中的下标
{
for(int i=0;i!=G.vernum;i++){
if(G.vers[i]==v)
return i;
}
return -1;
}
int minimun(closedge close,int vexnum)
{
int min=INFINITY;
int min_place =-1;
for(int i=0;i<vexnum;i++)
{//权值为0,说明顶点已经归入最小生成树中,之后每次和min进行比较,找出最小的权值
if(close[i].lowcost > 0 && close[i].lowcost < min)
{
min = close[i].lowcost;
min_place = i;
}
}
return min_place; //返回最小权值所在的数组下标
}
void MiniSpanTree_Prim(MGraph G,VertexType u)
{
k = LocateVex(G ,u); //返回点u在G.vexs中的下标
for(int i<0;i<G.vexnum;i++)
{
if(i!=k)
{
closedge[i].lowcost = G.arcs[k][i].adj;
closedge[i].adjvex = G.vers[k];
}
}
closedge[k].lowcost =0; //初始,U={u}
for(int i=1;i<G.vexnum;i++)
{
k=minimum(closedge,G.vernum); //求出加入生成树的下一个顶点k
printf("<v%d v%d>",closedge[k].adjvex,G.vexs[k]);
closedge[k].lowcost =0; //将k顶点并入U集
for(int j=0;k<G.vexnum;j++)
{ //修改其他顶点的最小边
if(G.arcs[k][j].adj < closedge[j].lowcost)
{
closedge[j].adjvex =k;
closedge[j].lowcost = G.arcs[k][j].adj;
}
}
}
return ;
}