求解最小生成树:Prim算法

Prim算法

Prim算法的核心在于选择最小两栖边,每加入一条边需要修改当前两栖边的信息。
以下程序采用邻接矩阵存储图,程序的形参是邻接矩阵(Mat[i][j])。
首先,定义最小生成树的边集的结构体,包括边的两个端点,以及边的权值。

struct EdgeTree 
{
    int begin,end;
    int length;
};

求解最小生成树的第一步,初始化边集(两栖边),默认从第一个结点开始。Point_num为图的顶点数。

    for(v=1;v<Point_num;v++)
    {
        Tree[v-1].begin=0;
        Tree[v-1].end=v;
        Tree[v-1].length=Mat[0][v]; 
    }

选取Point_num-2条边构成最小生成树的边集。

EdgeTree x;
for(k=0;k<=PD->Point_num-2;k++)//从第k条边建立最小两栖边
    {
        min=Tree[k].length;
        s=k;
        for(j=k+1;j<=Point_num-1;j++)
        {
            if(Tree[j].length<min)
            {
                min=Tree[j].length;//记录当前最小边的权值
                s=j;//记录最小边的下标
            }
        }
        v=Tree[s].end;//v为入选结点
        x=Tree[s];
        Tree[s]=Tree[k];
        Tree[k]=x;//通过交换,将当前最小边加入最小生成树边集
        for(j=k+1;j<=Point_num-2;j++)//由于新结点的加入,修改两栖边的信息
        {
            d=Mat[v][Tree[j].end];
            if(d<Tree[j].length&&d>0)
            {
                Tree[j].length=d;
                Tree[j].begin=v;
            }
        }
    }

每选择一条边,通过交换加入到Tree中;由于新加入一个结点,需要修改两栖边信息,修改方法为:新两栖边的权值如果小于之前两栖边的权值,则用新的覆盖掉旧的。循环(Point_num-2)次之后得到(Point_num-1)条边,完成求解最小生成树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值