void Prim(Graph g,int v0,int &sum)
{
int lowcost[maxsize],vset[maxsize];//lowcost数组表示当前生成树到某一节点的最短长度;vset表示此顶点是否已经加入到生成树中
int i,k,j,p,min;
//6-13行为初始化,主要做的有将起始顶点添加到生成树中去,并补全当前生成树下的lowcost值,由于起始顶点已经加入到了生成树中去,那么这个顶点的vset值则为1,sum用来记录当前生成树的权值,j指向最后一个加入到生成树中的顶点
for(i=0;i<g.n;i++)
{
lowcost[i]=g.edges[v0][i];
vset[i]=0;
}
sum=0;
j=v0;
vset[v0]=1;
for(k=0;k<g.n-1;k++)//因为起始顶点已经加入到了生成树中去,那么现在就只需要将余下的n-1个顶点加入即可
{//16-23行是找与当前生成树之间组成的边的权值最小的顶点
min=INF;//min初始化
for(p=0;p<g.n;p++)//对所有顶点进行遍历查找
{
if(vset[p]==0&&lowcost[p]<min)//当某一个顶点满足未被加入到生成树中且它的lowcost值比当前的min还小则更新min以及j的指向(j始终指向最后一个加入生成树的顶点)
{
min=lowcost[p];
j=p;
}
}
//待此循环结束后则找到了下一个该被加入到生成树中的顶点,此时j已经指向它了,并且min也是最小权值了
sum+=min;//累加权值
vset[j]=1;//表示这个顶点已经加入到生成树中了
for(p=0;p<g.n;p++)//28-34行则是由于生成树中新加入了一个新顶点可能会导致原有的lowcost值发生改变,这几行的功能就是更新lowcost值,假如原来lowcost[3]=∞,现在由于新顶点的加入,使得lowcost[3]=5,那么就需要更新它,而这个新顶点刚好是由j指向的,所以就依次检查即可。
{
if(g.edges[j][p]<lowcost[p]&&vset[p]==0)//已经存在于生成树中的顶点要排除掉,因为可能会构成环
{
lowcost[p]=g.edgs[j][p];
}
}
}
}
prim算法
最新推荐文章于 2021-05-23 12:55:11 发布