Matlab生成Kruskal最小生成树

%编程工具Matlab;
%这是一个通过避圈法求解连通带权图的最小生成树的程序.
n=input('请输入图的顶点数目:n= ')
W=input('请输入图的加权邻接矩阵:[W(1,1),..,W(1,n);..;W(n,1),..,W(n,n)]=') 
%用W(i,i)="inf" 代替 "=0"
%准备工作
T=zeros(n); %最小生成树的加权邻接矩阵 
WW=W;
   for i=1:n 
      for j=1:n
         if W(i,j)==inf  WW(i,j)=0; 
         end
      end
   end
m=((nnz(WW))/2);  %图的边线的数目
j=0; %最小生成树的边线的数目
%主要步骤
for i=1:m %被选择边线的数目
   if j<(n-1) %算法的终止条件是 |E|=|V|-1.
%步骤0: 挑选出权值最小的边 W(a,b)
      min=inf; a=0; b=0;     
      for k=1:n
         for l=(k+1):n
            if W(k,l)<=min  min=W(k,l); a=k; b=l; end 
         end
      end
%步骤0 结束
%步骤1
%T=T+e(a,b)
      T(a,b)=W(a,b); T(b,a)=W(a,b); 
%检查是否有环的出现 
      f=0; %没有环的出现
      P=zeros(2,m);  y=0; 
      for i=1:n
         for v=(i+1):n
            if T(i,v)~=0    y=y+1; P(1,y)=i; P(2,y)=v;  
            end
         end
      end
      for y=1:m
         if P(1,y)<P(2,y)
            for l=(y+1):m
               if P(1,l)==P(2,y)  P(1,l)=P(1,y);
               elseif P(2,l)==P(2,y)  P(2,l)=P(1,y);
               end
            end
            P(2,y)=P(1,y); 
         elseif P(2,y)<P(1,y)
            for l=(y+1):m
               if P(1,l)==P(1,y)  P(1,l)=P(2,y);
               elseif P(2,l)==P(1,y)  P(2,l)=P(2,y);
               end
            end
            P(1,y)=P(2,y);
         elseif (P(1,y)+P(2,y))~=0   f=1; %出现一个环
            break 
         end
      end
      if f==1   T(a,b)=0; T(b,a)=0; %转到 步骤2
      else j=j+1; %转到 步骤3
      end
      W(a,b)=inf;
   else %如果条件|E|=|V|-1成立
      MST=T;
      input('这个图的最小生成树的加权邻接矩阵是:') 
      MST
      break
     end  
   end
if j<(n-1) %如果条件|E|<|V|-1成立
   input('这个图没有最小生成树.')  
end
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值