图——prim算法

用途:构造无向连通网络最小代价生成树

步骤:

    首先,从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加到生成树上
    }   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值