您的位置:首页 > 理论基础 > 数据结构算法

最小生成树-普里姆方法(Prim)

2016-02-21 12:38 302 查看
生成树:保留一部分的边,使图连通但无回路。

普里姆方法(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),与顶点数有关,与边的数量无关,适用于稠密图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息