带全最小生成树-普里姆算法
前言:要把下面的所有节点都链接起来,路径的数字为权重,计算下图中最小的成本,
算法代码
#define MAXVET 9
#define INIFINITY 65535
struct MGraph
{
int numVertexes;
int arc[MAXVET][MAXVET];
};
void MiniSpanTree_Prim(MGraph G)
{
int min, i, j, k;
int adjvex[MAXVET];//保存相关顶点下标
int lowcost[MAXVET];//保存相关顶点边的权值
lowcost[0] = 0;//V0作为最小生成树的根开始遍历,权值为0
adjvex[0] = 0;//V0第一个加入
//初始化操作
for (i = 1; i < G.numVertexes; i++)
{
lowcost[i] = G.arc[0][i];
adjvex[i] = 0;
}
//真正构造最小生成树的过程
for (i = 1; i < G.numVertexes; i++)
{
min = INIFINITY;
j = 1;
i = 0;
//遍历全部顶点
while (j < G.numVertexes)
{
//找出lowcost数组已存储的最小权值
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j; //将发现的最小权值的下标存入k,以待使用
}
j++;
}
//打印当前顶点边中权值最小的边
printf("(%d,%d)", adjvex[k], k);
lowcost[k] = 0; //将当前顶点的权值设置为0,表示此顶点已经完成任务,进行下一个顶点的遍历
//邻接矩阵k行逐个遍历全部顶点
for (j = 1; j < G.numVertexes; j++)
{
if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
}
算法相关步骤:
把0作为最小生成树的根节点
灰色的边表示已经放弃掉了