使用MATLAB中的函数minspantree来实现Prim算法和Kruskal算法进行最小代价树的生成,使用plot绘制原始树(蓝色),highlight来表示最小生成树的结果(红色)。
目录
一、准备
(1)随机数据。
(2)MATLAB 2022b(其他版本也可以)。
(3)新建脚本文件。
二、代码
(1)Kruskal算法
s=[1,1,1,2,2,2,3,3,4,4,5,5,6];
t=[2,3,4,5,3,6,5,7,5,6,6,7,7];
w=[35,24,10,25,14,34,6,11,12,30,15,25,21];
names={'1','2','3','4','5','6','7'};
G=graph(s,t,w,names);
p=plot(G,"EdgeLabel",G.Edges.Weight);
% 求解最小生成树
T=minspantree(G,"Method","sparse");
% sparse代表的是Kruskal算法
p=plot(G,"EdgeLabel",G.Edges.Weight);
highlight(p,T,"NodeColor","red","EdgeColor","red");
% 将最小生成树的边设置为红色
title("Kruskal算法");
(2)Prim算法
s=[1,1,1,2,2,2,3,3,4,4,5,5,6];
t=[2,3,4,5,3,6,5,7,5,6,6,7,7];
w=[35,24,10,25,14,34,6,11,12,30,15,25,21];
names={'1','2','3','4','5','6','7'};
G=graph(s,t,w,names);
p=plot(G,"EdgeLabel",G.Edges.Weight);
% 求解最小生成树
T=minspantree(G,"Method","dense");
% dense代表的是Prim算法
p=plot(G,"EdgeLabel",G.Edges.Weight);
highlight(p,T,"NodeColor","red","EdgeColor","red");
% 将最小生成树的边设置为红色
title("Prim算法");
三、结果
(1)原始生成树结果
(2)Kruskal算法结果
(3)Prim算法结果
四、说明
注意:若在生成最小代价树的过程中,若在最小代价树生成过程中出现多个边权值相等的情况,那么就随机选择其中的一条边。
Kruskal算法的核心思想是贪心思想,通过局部最优达到整体最优:
- 将所有的边权进行排序。
- 不断迭代选择权最小的边,直到所有的点被连起来(边数=节点数-1)。
- 在迭代期间,如果边构成环,就要丢弃该边,因为树中是不存在环的。
(需要完整代码及运行结果请留言~