【MATLAB】最小生成树Kruskal算法

目录

    • 1.Kruskal算法
      • 1.1 基本思想
      • 1.2 步骤
    • 2.算法实现
      • 2.1 存储结构
      • 2.2 MATLAB代码

1.Kruskal算法

1.1 基本思想

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

1.2 步骤

【MATLAB】最小生成树Kruskal算法_第1张图片

∙ \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表示最下生成树的总的权值。
【MATLAB】最小生成树Kruskal算法_第2张图片

你可能感兴趣的:(Matlab,matlab,图论,Kruskal)