【MATLAB】最小生成树Kruskal算法

1.Kruskal算法

1.1 基本思想

将图的n个顶点看作n个分离的部分树,每个树具有一个顶点,算法的每一步就是选择连接两个分离树的具有最小权值的边,将两个树合二为一,直到只有一个树为止(进行n-1步)得到最小生成树。

1.2 步骤

∙ \bullet 选择边e1,使得w(e1)尽可能小。

∙ \bullet 再次选择最小边,必须满足不构成圈且边权尽可能小。

∙ \bullet 直到不能满足则停止。

按照上述步骤:
∙ \bullet 先选取顶点1-4的边,权值为1
∙ \bullet 接着去顶点4-5的边,权值为3
∙ \bullet 接下来本来应该去顶点1-5的边,但是由于会构成环,所以不选取
∙ \bullet 接着选取顶点2-3的边,权值为6
∙ \bullet 接着选取顶点2-5的边,权值为7,最小生成树构成。


2.算法实现

2.1 存储结构

我们使用边权矩阵进行存储数据,边权矩阵就是按列写入,每列由出发顶点接收顶点边的权值组成,如下所示:

[ 1 1 1 2 2 3 3 4 2 4 5 3 5 4 5 5 8 1 5 6 7 9 10 3 ] \begin{bmatrix} 1 & 1 & 1 & 2 & 2 & 3 & 3 &4\\ 2 & 4 & 5 &3 & 5 & 4 & 5 & 5\\ 8 & 1 & 5 & 6 & 7 & 9 & 10 & 3\\ \end{bmatrix} 1281411552362573493510453

2.2 MATLAB代码

%边权矩阵,每一列都表示一条边,从上到下分别为两个顶点以及它们边的权值
b = [1 1 1 2 2 3 3 4;
     2 4 5 3 5 4 5 5;
     8 1 5 6 7 9 10 3];
%sortrows函数对某一列进行比较排序,所以我们先转置b矩阵,然后对第三列也就是权值进行排序
[B,i]=sortrows(b',3);
%再将其转置回来
B=B';
%m为边的条数,n为点的个数
m=size(b,2);n=5;
%t数组用来标记选中的边,k用来计数,T矩阵用来存储选中的边,c计算最小生成树的总长度
t=1:n;k=0;T=[];c=0;

for i=1:m
    if t(B(1,i))~=t(B(2,i))
        k=k+1;T(k,1:2)=B(1:2,i),c=c+B(3,i);
        tmin=min(t(B(1,i)),t(B(2,i)));
        tmax=max(t(B(1,i)),t(B(2,i)));
        for j=1:n
            if t(j)==tmax
                t(j)=tmin;
            end
        end
    end
    if k==n-1
        break;
    end
end
T,c,

结果:T表示最小生成树的边,c表示最下生成树的总的权值。
在这里插入图片描述

  • 24
    点赞
  • 174
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比奇堡咻飞兜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值