用途:构造无向连通网络最小代价生成树
步骤:
首先,从n个顶点中任选一个顶点Vx加入到原来为空的生成树中;然后,重复执行以下操作:从一个顶点在生成树中,而另一个顶点不在生成树的那些边中,选取一条权值最小的边,并将这条边以及它所关联的目前还不在生成树中的那个顶点加入生成树中。
当生成树中的顶点数达到n时,整个构造过程结束。
三个辅助数组的作用:
1、mark数组标记顶点是否已进入生成树
vi未进入生成树,mark[i]=false
vi进入生成树后,mark[i]=true
2、lowcost数组记录各顶点到生成树的最近距离
3、nearest数组记录生成树中的顶点序号
注:
key process有两个部分:(1)进顶点 (2)修正未进顶点与树的距离
代码:
//普里姆算法
template<class T>
void ExtLGraph<T >::Prim(int k,int* nearest,T* lowcost){
int i, j;
bool* mark=new bool[n];
ENode<T> *p;
if (k<0||k>n-1) {
cout<<“OutofBounds”; return;
}
for (int i=0;i<n;i++){
mark[i]=false;
lowcost[i]=INFTY; nearest[i]=-1;
}
mark[k]=true; lowcost[k]=0; nearest[k]=k;
for (i=1;i<n;i++){
for(p=a[k]; p; p=p->nextArc){
j= p->adjVex; //修改lowcost和nearest的值
if ((!mark[j] )&&(lowcost[j]>p->w)){
lowcost[j]=p->w; nearest[j]=k;
}
}
T min=INFTY; //求下一条最小权值的边
for (j=0;j<n;j++)
if ((!mark[j])&&(lowcost[j]<min)){
min=lowcost[j]; k=j;
}
mark[k]=true; //将顶点k加到生成树上
}
}