美赛(matlab自学)之图与网络(自用)

最小生成树问题

基础知识

连通的无圈图叫做树
度为1的顶点叫做叶子顶点

例题

在这里插入图片描述

prim算法

clc;clear ;
a = zeros(7);%7行7列零矩阵
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+a';
a(a==0)= inf;
result =[];
p=1;
tb=2:length(a);
while size(result,2) ~=length(a) -1
    temp = a(p,tb) ;temp = temp(:);
    a =min( temp);
    [jb,kb] = find(a(p,tb)==d,1);%找第1个最小值
     j =p(jb);
    k=tb(kb);
    result =[ result,[j;k;d]];
    p=[p,k];
    tb( find(tb==k))=[];
end
result

书上的模板代码,但是不知道为什么运行结果显示超出了矩阵维度??
只能以后再解决了……

kruskal算法

clc;clear;
a(1,[2,3]) =[50,60]; a(2,[4,5])=[65,40];%这里给出邻接矩阵的另外一种输入方式
a(3,[4,7]) =[52 ,45]; a(4,[5,6]) =[50,30];
a(4,7) =42; a(5,6) =70;
[i,j,b] =find(a); %行,列,值
data=[i';j' ;b'];
index = data(1:2,:);
loop=length(a)-1;
result=[];
while length( result) < loop
temp = min( data(3,:));
flag=find(data(3,:)==temp);
flag= flag(1);
v1 = index(1, flag);v2 = index(2,flag);
if v1~=v2
result=[result,data(:,flag)];
end
index(find(index==v2))=v1;
data(:,flag)=[];
index(:,flag) =[];
end
result
发布了5 篇原创文章 · 获赞 0 · 访问量 239

猜你喜欢

转载自blog.csdn.net/weixin_44544406/article/details/104078447
今日推荐