普利姆算法用来做什么?
·要弄清楚普利姆算法的用途,首先要知道连通图是什么,
连通图就是图中任一两点可达。
·然后就是树的概念,
这里的树不是数据结构的中的树,这里树的概念是:无环的连通图。
·然后我们就可以来讲普利姆算法了,普利姆算法是用来求图的最小生成树(即最小权重生成树)的。
他算法的思路是这样的:① 从图中任意找一个点,加入到最小生成树中;
②在剩下的顶点中,找权重最小的边,将该顶点纳入最小生成树;
③重复步骤②;
·在实现该算法的过程中,主要用到两个数组lowcost[maxvex],adjvex[maxvex],只要理解这两个数组的意义,就能理解这个算法的实现。
lowcost[maxvex]数组的意义:lowcost[j]表示,在已经被纳入生成树的顶点中,他们到顶点 j 的最小权重的值。
adjvex[maxvex]数组的意义:adjvex[j]表示,j 这个顶点的最小权重,是以哪个顶点为起点的。
void prim(MGraph G){
int lowcost[MAXVEX], adjvex[MAXVEX]; //普里姆算法的两个关键数组
int i, j, min; //i,j是循环用到的临时变量,k用来存放找到的顶点
//初始化
lowcost[0] = 0;
adjvex[0] = 0;
for(i = 1; i < numVex; i ++){
lowcost[i] = G.arc[0][i];
adjvex[i] = 0;
}
//普利姆算法的核心
for(i = 1; i < numVex; i ++){
min = INTINITY;
//找出在到已有生成树中,权重最小的顶点,
for(j = 1, k = 0; j < numVex; j ++){
if(lowcost[j] != 0 && lowcost[j] < num){
min = lowcost[j];
k = j;
}
}
lowcost[k] = 0;
printf("(%d,%d)", adjvex[k], k);
//将顶点k纳入生成树之后,更新lowcost[]和adjvex[]的数据
for(j = 1; j < numVex; j ++){
if(lowcost[j] != 0 && G.arc[k][j] < lowcost[j]){
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
}