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

来源:互联网 发布:linux cs 编辑:程序博客网 时间:2024/05/04 06:34

生成树:保留一部分的边,使图连通但无回路。


普里姆方法(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),与顶点数有关,与边的数量无关,适用于稠密图。


0 0
原创粉丝点击