MATLAB最小生成树Kruskal算法
Posted 桃陉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 存储结构
我们使用
边权矩阵
进行存储数据,边权矩阵就是按列写入,每列由出发顶点
、接收顶点
和边的权值
组成,如下所示:
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表示最下生成树的总的权值。
以上是关于MATLAB最小生成树Kruskal算法的主要内容,如果未能解决你的问题,请参考以下文章