matlab最小支撑树的实现

  1. 最近在准备校内数模竞赛,选题的程序实现需要使用最小支撑树结构,所以就研究了一下

  2. function MST_Prim()  
  3. %问题:最小生成树(Minimum Spanning Tree)  
  4. %算法:Prim  
  5.   
  6. clc, clear;  
  7. %% 做连接图  
  8. a = zeros(7);  
  9. a(1,2)=3; a(1,3)=4; a(1,4)=7;  
  10. a(2,3)=3; a(2,4)=2; a(2,5)=4;  
  11. a(3,5)=5; a(3,6)=7;  
  12. a(4,5)=2; a(4,7)=6;  
  13. a(5,6)=1; a(5,7)=4;  
  14. a(6,7)=2;  
  15.   
  16. %% Prim算法 (思考)  
  17. a=a+a';a(a==0)=inf;  
  18. result=[];p=1;tb=2:length(a);  
  19. while length(result)~=length(a)-1  
  20.     temp=a(p,tb);temp=temp(:);  
  21.     d=min(temp);  
  22.     [jb,kb]=find(a(p,tb)==d);  
  23.     j=p(jb(1));k=tb(kb(1));  
  24.     result=[result,[j;k;d]];p=[p,k];tb(tb==k)=[];  
  25. end  
  26. Wt=sum(result(3,:));  
  27. disp(['最短架设电线总长度:', int2str(Wt)]);  
  28. %% 画最小树  
  29. axis equal;            %画最小生成树     
  30. hold on  
  31. n=7;  
  32. [x,y]=cylinder(1,n);   %画出顶点,均匀画圆  
  33. xm=min(x(1,:));  
  34. ym=min(y(1,:));  
  35. xx=max(x(1,:));  
  36. yy=max(y(1,:));  
  37. axis([xm-abs(xm)*0.15,xx+abs(xx)*0.15,ym-abs(ym)*0.15,yy+abs(yy)*0.15]);  
  38. plot(x(1,:),y(1,:),'ko');  
  39. for i=1:n  
  40.     temp=['v',int2str(i)];  
  41.     text(x(1,i),y(1,i),temp);  
  42. end  
  43. for i=1:k-n+1 %画出不在树内的边  
  44.     plot(x(1,data(1:2,i)),y(1,data(1:2,i)),'b');  
  45. end  
  46. for i=1:n-1  %画出树内的边  
  47.     plot(x(1,result(1:2,i)),y(1,result(1:2,i)),'r');  
  48. end  
  49. text(-0.35,-1.2,['最小生成树的权为','',num2str(Wt)]);  
  50. title('红色连线为最小生成树');  
  51. axis off;  
  52. hold off;  

猜你喜欢

转载自blog.csdn.net/qq_36711048/article/details/80342276