最小生成树的Prim算法
来源:互联网 发布:js判断是否为身份证号 编辑:程序博客网 时间:2024/05/18 20:08
最小生成树的Prim算法
一、基本思想
取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w。在添加的顶点 w 和已经在生成树上的顶点v 之间必定存在一条边,并且该边的权值在所有连通顶点 v 和 w 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有n-1 个顶点为止。
一般情况下所添加的顶点应满足下列条件:
«在生成树的构造过程中,图中 n 个顶点分属两个集合:已落在生成树上的顶点集 U 和尚未落在生成树上的顶点集V-U ,则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。
二、示例
三、算法框架
Prim算法可用下述过程描述,其中用w(u,v)表示顶点u与顶点v边上的权值。
Prim(GraphG, int v0)
{// v0-初始出发点,E-生成对中边的集合,U-生成树中顶点的集合
E=Φ
U={v0}//U已经处理顶点集合
S={v1,v2,v3,……,vn-1}//图中剩余顶点集合
while(S ≠ φ){
(u,v)=argmin{w(u,v) | u∈U, v∈S}
S=S- {v}
U=U+{v}
E=E +{(u,v)}
}
}
四、问题探讨
Prim算法的思路比较容易理解,下面我们研究如何将算法框架进一步细化成具体的算法。在具体写出Prim算法时,我们首先要解决几个问题。
① 生成树如何表示?
② 如何表示集合S? 如何表示集合T=V-S?
③ 算法框架中,求最小权值的边
(u,v)=min{w(u,v);u∈T,v∈S },
这个算法如何实现?
u对于第一个问题,生成树的表示方法很多。这里突出Prim算法的这个主题,我们简单地用边集数组表示,即简单列出生成树中的边。
u第二和第三个问题是相互联系和影响的。一般使用一维数组表示集合,由于集合U与集合S是互补的,因此只需要一个数组就将集合S和集合U表达出来,我们用一维数组S表示
Ø当S中的某个元素S[i]≠0时表示对应顶点i属于集合S,即还未处理。
Ø当S[i]=0时,表示对应顶点i属于集合U,即已经处理过。
Ø我们用数组S[i]的值表示当前状态下顶点vi的最小权值,即未处理的点i到已经处理的点的当前最短距离。
如何根据(u,v)=min{w(u,v);u∈U,v∈S }求最小权值的边(u,v)呢?直接在数组S中求权值最小的元素,其对应顶点即为v,为了找到与v其相邻的另一顶点u,需要设置一个数组P表示与v相邻的另一顶点在生成树中是v的双亲节点。其含义是:
如果 P[i]=k,则表示顶点i的双亲节点k,也就是说二元组(P[i],i)表示一条边,我们用P[i]这个数组存储S[i]对应的连接情况,即S[i]>=0时,P[i]中存储当前最小权值的连接情况。
五、Java代码
<span style="color:#000000;">private int minCost(double S[]){ int vertexnum = graph.vertexCount(); double mincost = Double.MAX_VALUE;//初始化最小值 int min_v=-1;//初始化最小值对应的节点 for(int j=0;j<vertexnum;j++){ if(S[j] < mincost && S[j] != 0){//进行更新 mincost = S[j]; min_v = j; } } return min_v;//返回最短的坐标}public void prim(Graph graph, intv0, Graph tree){ intvertexNum=graph.vertexCount(); inti,j,u; double[]S=new double[vertexNum];//建立S[]数组 int[] P=new int[vertexNum];//建立P[]数组 for(i=0;i<vertexNum;i++){ //初始化S[]为源点到其他各点的长度,P[]为其他各未处理点到已处理点的最短距离 S[i]=graph.getWeight(v0,i); P[i]=v0; } S[v0]=0; P[v0]=-1;//将源点的信息进一步初始化,即已经处理过,标记S[v0]=0,P[v0]=-1; //循环直到集合S的所有顶点处理完毕 for(i=1;i<vertexNum;i++){ //在数组S中寻找当前最小权值的边的顶点,-1表示所有顶点处理完毕 u=minCost(S);//寻找未处理点中到已经处理过的点的距离最小的那个 if(u==-1)//未寻找到,所有的都已处理完毕,退出 break; tree.addEdge(P[u],u,S[u]);//将最小权值的边插入到生成树中 S[u]=0;//将顶点u移入到集合U中 for (j=0;j<vertexNum;j++){ //更新数组S和P doublew_uj=graph.getWeight(u,j);//已经寻找的点到其他各点的距离 if(w_uj<S[j]){//某点到已处理点的距离大于某点到该点的距离,进行更新 S[j]=w_uj; //更新S[j] P[j]=u; //更新P[j] } } }}</span>
0 0
- Prim 算法生成的最小生成树
- 最小生成树的prim算法代码
- 最小生成树的prim算法实现
- 构造最小生成树的 prim 算法
- 最小生成树的Prim算法
- 图的最小生成树(prim算法)
- 最小生成树的prim算法
- 最小生成树的prim算法
- JAVA的最小生成树(prim)算法
- 最小生成树的prim算法实现
- 最小生成树的prim算法
- 最小生成树的Prim算法
- 最小生成树的Prim算法笔记
- 求最小生成树的Prim算法
- 最小生成树的prim算法
- 构建最小生成树的prim算法
- 求最小生成树的prim算法
- 图的最小生成树---Prim算法
- Java 随机生成16进制颜色
- 晶体管三种接法的电压电流放大倍数
- Oracle序列的使用
- 深度学习实践指南(四)—— 一个典型的深度学习的实践流程
- hdu 1247 Hat’s Words(字典树)
- 最小生成树的Prim算法
- 基本类型的类型转换
- Ubuntu Cannot run program "../SDK/build-tools/xxx/aapt": erro = 2 No such file or directory
- Startservice的生命周期
- HDU 5658 CA Loves Palindromic(回文树)
- Oracle 横表变纵表
- 安卓017ListView & GridView & ScrollView
- BZOJ4382: [POI2015]Podział naszyjnika
- Java WebService 简单实例