1.Kruskal算法
1.1 基本思想
将图的n个顶点看作n个分离的部分树,每个树具有一个顶点,算法的每一步就是选择连接两个分离树
的具有最小权值的边
,将两个树合二为一,直到只有一个树为止(进行n-1
步)得到最小生成树。
1.2 步骤
![](https://img-blog.csdnimg.cn/9b7d8dd9fccd4dceaca9e32f0b4fe8cf.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_5qGD6ZmJ,size_16,color_FFFFFF,t_70)
∙ \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表示最下生成树的总的权值。