本文给出Prim算法描述及核心代码。
- Prim算法思想简述:
Prim算法通过一系列不断扩张的子树来构造一颗最小生成树。我们从图的顶点集合V中任意选择一个单顶点,作为序列中的初始子树。每一次迭代时,以一种贪婪的方式来苦熬张当前树,即简单的把不在树中的最近顶点添加到树中。当图中所有顶点都包含在所构造的树中以后,该算法就停止了。因为在每次迭代时,该算法只对树扩展一个顶点,这种迭代的总次数为n-1,其中n是图中树的顶点个数。对树进行扩展时用到的边的集合用来表示该算法的生成树。
- 代码实现:
//prim
typedef struct{
int adjvex; //最小边在集合u
int lowcost; //最小边上权值
}closedge;
closedge C[maxsize];
void Prim(Graph G){
int v=0; //初始节点
int minsumcost=0; //记录最小生成树的各边权值之和
int n=G.vexnum;
//初始化
for(int i=0;i<n;i++){
C[i].adjvex=v;
C[i].lowcost=G.Edge[v][i];
}
//进入余下循环
for(int i=1;i<n;i++){
int k,min=INF;
for(int j=0;j<G.vexnum;j++){
if(C[j].lowcost!=0&&C[j].lowcost<INF){
C[j].lowcost=k;
k=j;
}
}
minsumcost+=C[j].lowcost; //累加权值
for(int j=0;j<n;j++){ //更新最小边
if(C[j].lowcost!=0&&G.Edge[k][j]<C[j].lowcost){
C[j].lowcost=G.Edgw[k][j];
C[j].adjvex=k;
}
}
//printf("%d",minsumcost); //输出最小权值和
}