struct a
{
char adjex;//边上另一个顶点
int lowcost;// 边上权值
};//辅助结构体
//.lowcost设置为0表示点已经并入最小生成树中,adjex表示最小生成树中该点所在边的另一个点,
void prim(graph g,char v)
{
int sum=0;
int i,j,k,s,index,min;
a closedge[mvnum];
k=locate(g,v);//返回v的下标
closedge[k].lowcost=0;//将点进入u集合中。
for(i=0;i<g.vexnum;++i)
{
if(i!=k)
{
closedge[i].adjex=g.vexs[k];
closedge[i].lowcost=g.arcs[k][i];
}
}初始时候将以第一点为起始点其他边上顶点,和权值。
for(i=1;i<g.vexnum;i++)//对剩下的点输出 因为有n-1条边
{
//假设下标0最小权
for(s=0;s<g.vexnum;s++)
{
if(closedge[s].lowcost!=0)
{
min=closedge[s].lowcost/找到一个非0设为最小 t;
k=s;//记录下标
break;
}
}
for( j=0;j<g.vexnum;j++)
{
if(min>closedge[j].lowcost&&closedge[j].lowcost!=0)
{
k=j;//获取权值最小的下标
min=closedge[j].lowcost;//找到最小
}
}
char u0=closedge[k].adjex;
char v0=g.vexs[k];
cout<<u0<<" "<<v0<<"权值为"<<closedge[k].lowcost<<endl;// 输出最小边和权值
sum+=closedge[k].lowcost;
closedge[k].lowcost=0;
for(j=0;j<g.vexnum;j++)
{
if(g.arcs[k][j]<closedge[j].lowcost&&g.arcs[k][j]!=0)//以k为起始点的边权值小于其他最后点权值,小于就写
{
closedge[j].adjex=g.vexs[k];
closedge[j].lowcost=g.arcs[k][j];
}
}
}
cout<<"权值之和为"<<sum<<endl;
}