标签:
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)}
}
}
(u,v)=min{w(u,v);u∈T,v∈S },
这个算法如何实现?
<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){ int vertexNum=graph.vertexCount(); int i,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>
标签:
原文地址:http://blog.csdn.net/qq845579063/article/details/51360213