题目:要求一级点之间不连通,二级点要连接一级点,二级点之间可以相互连通。
克鲁斯卡尔算法:将路径从小到大的顺序依次放入图中,若不构成回路则保留路径,否则抛弃该构成回路的路径。
二级点不连通的解决办法:
利用克鲁斯卡尔算法的特点,将二级点之间的距离设置为最小的路径,让二级点最优先连接。然后计算得到矩阵之后将二级点之间的距离设置为0,即互不相连。完成。
画出来的图如下。
代码
A = xlsread('.\附件.xlsx','中心和一级','C2:D14'); % 导入中心和二级点的坐标
[~,ids] = xlsread('.\附件.xlsx','中心和一级','B2:B14'); % 提取点名称
X = A(:,1);
Y = A(:,2);
N = length(X);
D = zeros(N,N);
% 求任意两点距离,保存在距离矩阵D
for i = 2:N
for j = 1:i-1
D(i,j) = norm(A(i,:)-A(j,:)); % 求两点的欧氏距离
end
end
D1 = D+D'; % 邻接矩阵
% UG=tril(D1); % 要求是生成的无向图是一个下三角矩阵
UG = sparse(D); % 转为稀疏矩阵 ;% UG = sparse(D1)也行 D为下三角矩阵
[st,pred]=graphminspantree(UG,[1,2],'Method','Kruskal');
% 画出树状图
view(biograph(st,ids,'ShowArrows','off','ShowWeights','off'));
% 画出坐标图
A1 = xlsread('.\附件.xlsx','一级和二级','C14:D181'); % 导入坐标
gplot(st,A,'r-');hold on
scatter(26,31,'ko');text(26-1,31+2.5,{'A'},'FontWeight','bold','FontSize',15); % 中心点的坐标
scatter(A(2:end,1),A(2:end,2),100,'r*')
scatter(A1(:,1),A1(:,2),'b.')
% 设置标题和坐标轴
plot(0,0);
xlabel('X坐标');ylabel('Y坐标');title('中心点和一级点的连接图')