最小生成树 Prim

NYOJ 38 布线问题

Prim算法:N个顶点的图的最小生成树有N个顶点,N-1条边.

思想:分两个点集 S,U  (S+U=V全部顶点)  S中存放已经选入最小生成树的顶点, 开始任选一点放入S,遍历一下U,同时用一个数组Assist[505]来记录结果 找出和S中第一个点权值最小的点vi,把Assist[i-1]置零,表示已经被选入生成树.用vi遍历U中的点,同样找出U中的点和S中的点的权值最小的点.同时更新数组Assist[505];其记录着前i次的遍历结果的最小值.....例如U中的一个点v5  S中有v1 v2,其中D(v1,v5)=5,D(v2,v5)=3;则Assist[v5]=3; 本次从U中找出一个点v7 if(D(v7,v5)<3)则更新其值..

代码:

 
#include<cstdio>
int Assist[505];
int f[505][505];
int main()
{
int T,v,e,a,b,c,t,m,z,min,mx,sum;scanf("%d",&T);
while(T--)
{  
    scanf("%d%d",&v,&e);
    for(int i=1;i<=v;i++) 
        for(int j=i;j<=v;j++) f[j][i]=f[i][j]=1<<30;
    while(e--)
    {scanf("%d%d%d",&a,&b,&c);f[a][b]=f[b][a]=c;}
    mx=0,sum=0;
    m=1<<30;
    for(int i=0;i<v;i++) {Assist[i]=f[1][i+1];scanf("%d",&z);if(z<m) m=z;}
    t=v-1;
    while(t--)
    {
        min=10000;
        for(int i=1;i<v;i++)
            if(Assist[i]&&(Assist[i]<min)) {min=Assist[i];mx=i;}
            sum+=min;
            Assist[mx]=0;
            for(int i=1;i<v;i++) if(f[mx+1][i+1]<Assist[i]) Assist[i]=f[mx+1][i+1];
    } 
    printf("%d\n",sum+m);
}
}        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值