最小生成树Prim算法

#define MAX 1<<20
#define M 1005
int lowcost[M];//当前生成树u的集合到其他各顶点的边最短的集合
//lowcost初始为出发点到其他点的距离,不断更新为二叉树
int vis[M];//标记节点是否进入生成树,1为进入,0为无
struct stu
{
    int N;//顶点个数
    int e;//边的个数
    int map[M][M];//基础输入
};
void init(stu R)//初始化数组
{
    for(int i=0;i<R.N;i++)
    {
        for(int j=0;j<R.N;j++)
        {
            R.map[i][j]=0;
        }
    }
}
void prim(stu R,int v)//v为出发点,此处的prim算法类似于打表
{
    for(int i=0;i<R.N;i++)
    {
        lowcost[i]=R.map[v][i];//记录起点v距离其他点的距离
        vis[i]=0;//初始化所有的点都没有进入二叉树
    }
    vis[v]=1;//很明显v进入二叉树,所以进行标记
    int sum=0;//记录最短路长度,最短路数据存在lowlost数组里
    int k;
    int min;
    for(int i=0;i<R.N;i++)
    {
        min=MAX;//初始为最大值
        for(int j=0;j<R.N;j++)
        {
            if(vis[j]==0&&lowcost[j]<min)
            {
                min=lowcost[j];
                k=j;
            }
        }//不断循环,知道发现与v相连的最小边,计入最短路
        vis[k]=1;
        v=k;//此时将v更新为k,查找k的最近边
        sum+=min;
        /*开始更新lowcost的数值,如果vis[j]==0;
        说明已经在此之前已经两个顶点已经联通,
        所以只遍历与出发点同属并查集但并未初始相连的点*/
        for(int j=0;j<R.N;j++)
        {
            if(vis[j]==0&&R.map[v][j]<lowcost[j])/*此处v已经更新为新的节点
            所以将其关联点距离与出发点距离各顶点做对比*/
            {
                lowcost[j]=R.map[v][j];
            }
        }
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值