什么是最小生成树?如何实现最小生成树的普里姆算法(Prim)?
1、在一个连通网的所有生成树中,各边的代价之和最小的那棵生成树
称为该连通网的最小代价生成树,简称最小生成树;
简单点说,就是各个点连通,边权和最小的那棵树
2、先说一下代码的核心思想(不知道核心看代码很费劲的)
首先随便找一个顶点V0,存放在集合U中,我们寻找从V0出发到其他的
各顶点的最小边权Vi,并存到集合U中,并更新,集合U中的点到
其他顶点的比较短的距离,,然后继续寻找最短距离,一直这样下去
每找到一个点就要更新一下最短距离
从这个思想中我们可以知道最小生成树的时间复杂度之于顶点的数目
有关,如果顶点数目为n,那么时间复杂度为n*n
//Prime算法最小生成树
void MinSpanTree(HGraph G,int u)//u代表从哪一个定点开始
{ //u的无关紧要,都一样
int i,j,min;
int adjvex[MAXVEX];//下标i,对应的值为j,代表i和j相连
int lowcost[MAXVEX];//下标为j,代表某个点到j点的最小权值(一直在更新)
lowcost[u]=0;
adjvex[u]=u;
for(i=1;i<G.numVertexes;++i)
{
lowcost[i]=G.acr[u][i];//记录i的权值
adjvex[i]=u;
}
for(i=1;i<G.numVertexes;++i)
{
min=INF;
int k;//记录最小权值的顶点
for(j=1;j<G.numVertexes;++j)
{
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
printf("%d %d ",adjvex[k],k);//代表最小生成树中adjvex[k],k
//两个顶点相连,根据最后的输出结果可以画出最终的最小生成树
lowcost[k]=0;
for(j=1;j<G.numVertexes;++j)
{
if(lowcost[j]!=0&&G.acr[k][j]<lowcost[j])
{
adjvex[j]=k;//及时更新j点到其他与它相连的最短距离
//以及最短距离的顶点
lowcost[j]=G.acr[k][j];
}
}
}
}