一、普里姆算法(Prim算法)
(1)算法
1)将v0到其他顶点的所有边当作侯选边;
2)重复一下步骤n-1次,使得其他n-1个顶点被并入到生成树中。
①从侯选边中挑选出权值最小的边输出,并将与该边另一端相接的顶点v并入生成树中;
②考查所有剩余顶点vi,如果(v,vi)的权值比lowcost[vi]小,则用(v,vi)的权值更新lowcost[vi]。
/*邻接矩阵的结构定义*/
typedef struct{
int no; //顶点编号
//char info; //顶点其他信息
}VertexType;
typedef struct{ //图的定义
int edges[maxSize][maxSize]; //邻接矩阵定义
int n, e; //分别为顶点数和边数
VertexType vex[maxSize]; //存放顶点信息
}MGraph; //图的邻接矩阵类型
void Prim(MGraph g, int v0, int &sum){
int lowcost[maxSize], vset[maxSize], v;
int i, j, k, min;
for(i=0;i<n;i++){
lowcost[i]=g.edges[v0][i];
vset[i]=0;
}
vset[v0]=1; //将v0并入树中
sum=0; //sum清零,用来累计树的权值
for(i=0;i<n-1;i++){
min=INF;
for(j=0;j<g.n;j++){
if(vset[j]==0&&lowcost[j]<min) //选出当前生成树到其余顶点,最短边中