void Prim(int G[][4],int n)
{
int min,i,j,k;
int adjvex[n]; /*adjvex[i]=k表示第i个顶点vi与已加入最小生成树的所有点中的第k个顶点vk,合成的边(k,j)的权值是最小的*/
int lowcost[n]; /*lowcost[i]=X表示i个顶点vi与已加入最小生成树的所有点中边最小的权值是X,所以lowcost[i]=0表示第i个顶点加入最小生成树中*/
lowcost[0]=0;/*把第一个顶点v0加入生成树中*/
adjvex[0]=0;
for(i=1;i<n;i++)
{
adjvex[i]=0;/*现在只有0加入生成树中,当然adjvex[i]=0*/
lowcost[i]=G[0][i];
}
for(i=1;i<n;i++)
{
min=65535;/*设计为无穷大*/
j=1;
k=0;
while(j<n)
{
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
j++;
}
lowcost[k]=0;/*将第k个加入到最小生成树中*/
printf("(%d,%d)-->%d\n",adjvex[k],k,min);/*打印刚加入生成树的边和权值*/
for(j=1;j<n;j++)
{
if(lowcost!=0&&G[k][j]<lowcost[j])/*k到j的权值比其他已加入最小生成树的点更小*/
{
lowcost[j]=G[k][j];
adjvex[j]=k;
}
}
}
}
求图的最小生成树之--Prim算法实现
最新推荐文章于 2022-11-16 19:19:36 发布