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算法的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB最小生成树Kruskal算法

最小生成树详解 prim+ kruskal代码模板

(最小生成树)Kruskal算法

最小生成树及Prim算法及Kruskal算法的代码实现

最小生成树算法:Kruskal算法 Prim算法

最小生成树