prim 最小生成树

 生成树是一个连通图的生成树是该联通图的一个极小联通子图,含有图的全部顶点。 最小生成树是在生成树的基础上要求树的(n-1)条边的权值之和是最小的。

要求: 必须是该图中的边、无回路、n-1个边连n个顶点、这n-1个边上的权值之和是最小。、

 

int prim(int n)
{
    //第一个点到其他点的距离
    for(int i=1;i<=n;i++)
    {
        dis[i]=mp[1][i];
    }
    vis[1]=1;
    //还剩n-1个点
    int x=n-1;
    while(x--)
    {
        int mi=INF;
        int v=-1;
        //找下一个到源点的最短路的点 记录其为v
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&dis[i]<mi)
            {
                mi=dis[i]; v=i;
            }
        }
        //ans记录最小权值和
        ans+=dis[v];
       // cout<<v<<endl;
        vis[v]=1;// 标记走过
        //更新dis的值  "源点"变了 变成v了
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&dis[i]>mp[v][i])
            {
                dis[i]=mp[v][i];  //以v为源点
            }
        }
    }
    return ans;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值