- 最近在准备校内数模竞赛,选题的程序实现需要使用最小支撑树结构,所以就研究了一下
- function MST_Prim()
- %问题:最小生成树(Minimum Spanning Tree)
- %算法:Prim
- clc, clear;
- %% 做连接图
- a = zeros(7);
- a(1,2)=3; a(1,3)=4; a(1,4)=7;
- a(2,3)=3; a(2,4)=2; a(2,5)=4;
- a(3,5)=5; a(3,6)=7;
- a(4,5)=2; a(4,7)=6;
- a(5,6)=1; a(5,7)=4;
- a(6,7)=2;
- %% Prim算法 (思考)
- a=a+a';a(a==0)=inf;
- result=[];p=1;tb=2:length(a);
- while length(result)~=length(a)-1
- temp=a(p,tb);temp=temp(:);
- 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(tb==k)=[];
- end
- Wt=sum(result(3,:));
- disp(['最短架设电线总长度:', int2str(Wt)]);
- %% 画最小树
- axis equal; %画最小生成树
- hold on
- n=7;
- [x,y]=cylinder(1,n); %画出顶点,均匀画圆
- xm=min(x(1,:));
- ym=min(y(1,:));
- xx=max(x(1,:));
- yy=max(y(1,:));
- axis([xm-abs(xm)*0.15,xx+abs(xx)*0.15,ym-abs(ym)*0.15,yy+abs(yy)*0.15]);
- plot(x(1,:),y(1,:),'ko');
- for i=1:n
- temp=['v',int2str(i)];
- text(x(1,i),y(1,i),temp);
- end
- for i=1:k-n+1 %画出不在树内的边
- plot(x(1,data(1:2,i)),y(1,data(1:2,i)),'b');
- end
- for i=1:n-1 %画出树内的边
- plot(x(1,result(1:2,i)),y(1,result(1:2,i)),'r');
- end
- text(-0.35,-1.2,['最小生成树的权为','',num2str(Wt)]);
- title('红色连线为最小生成树');
- axis off;
- hold off;
matlab最小支撑树的实现
猜你喜欢
转载自blog.csdn.net/qq_36711048/article/details/80342276
今日推荐
周排行