求出下图的最小生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求出下图的最小生成树
解:MATLAB程序:
% 求图的最小生成树的prim算法。
% result的第一、二、三行分别表示生成树边的起点、终点、权集合
% p——记录生成树的的顶点,tb=V\p
clc;clear;
% a(1,2)=50; a(1,3)=60;
% a(2,4)=65; a(2,5)=40;
% a(3,4)=52;a(3,7)=45;
% a(4,5)=50; a(4,6)=30;a(4,7)=42;
% a(5,6)=70;
% a=[a;zeros(2,7)];
e=[1 2 20;1 4 7;2 3 18;2 13 8;3 5 14;3 14 14;4 7 10;5 6 30;5 9 25;5 10 9;6 10 30;6 11 30;7 8 2;7 13 5;8 9 4;8 14 2;9 10 6;9 14 3;10 11 11;11 12 30];
n=max([e(:,1);e(:,2)]); % 顶点数
m=size(e,1); % 边数
M=sum(e(:,3)); % 代表无穷大
a=zeros(n,n);
for k=1:m
a(e(k,1),e(k,2))=e(k,3);
end
a=a+a';
a(find(a==0))=M; % 形成图的邻接矩阵
result=[];p=1; % 设置生成树的起始顶点
tb=2:length(a); % 设置生成树以外顶点
while length(result)~=length(a)-1 % 边数不足顶点数-1
temp=a(p,tb);temp=temp(:); % 取出与p关联的所有边
d=min(temp); % 取上述边中的最小边
[jb,kb]=find(a(p,tb)==d); % 寻找最小边的两个端点(可能不止一个)
j=p(jb(1));k=tb(kb(1)); % 确定最小边的两个端点
result=[result,[j;k;d]]; % 记录最小生成树的新边
p=[p,k]; % 扩展生成树的顶点
tb(find(tb==k))=[]; % 缩减生成树以外顶点
end
result % 显示生成树(点、点、边长)
weight=sum(result(3,:)) % 计算生成树的权
程序结果:
result =
1 4 7 8 14 7 9 13 10 10 14 10 11 4 7 8 14 9 13 10
2 5 11
3 6 12 7 10 2 2 3 5 6 8 9 11 1
4 30 30 weight =
137
附图
最小生成树的权是137