生成树:保留一部分的边,使图连通但无回路。
普里姆方法(Prim)步骤:
(1) 找最小边,及两个顶点为最初的树
(2) 与树相接的边中取权值最小的一条边
(3) 将边及相应顶点并入树
循环(2) (3)可得到最小生成树。
示例如下:
C代码如下:
void Prim(MGraph g,int v, int &sum)
{ //lowcost记录树到各顶点的最小权值,vset记录顶点v是否并入树
int lowcost[maxSize], vset[maxSize];
int i, j, k, min;
sum = 0; //sum用来累计树的权值
for(i = 0; i < g.n; ++i){ //lowcost、vset赋初值
lowcost[i] = g.edges[v][i];
vset[i] = 0;
}
vset[v] = 1;
for(i = 0; i < g.n-1; ++i){ //共选出n-1条边
min = INF; //INF是一个比所有权值都大的常量
for(j = 0; j < g.n; ++j) //选树到各顶点的边的最小值
if(vset[j] == 0 && lowcost[j] < min){
min = lowcost[j];
k = j;
}
vset[k] = 1; //入树
sum += min;
for(j = 0; j < g.n; ++j) //更新树到其他顶点的边的最小值
if(vset[j] == 0 && g.edges[k][j] < lowcost[j])
lowcost[j] = g.edges[k][j];
}//for i
}//end
时间复杂度为O(n^2),与顶点数有关,与边的数量无关,适用于稠密图。