加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]Kruskal算法--求最小生成树--matlab代码

(2015-04-13 15:45:37)
标签:

转载

分类: 数据挖掘与知识发现
%Kruskal算法
%b--图的边权矩阵
%T--最小生成树的边集合
%v--最小生成矩阵的邻接矩阵
%c--最小生成树的权
%k--已经被选入生成树的边数
function[T,v,c]=kruskal(b)
%根据边权矩阵求出图的边数
m=size(b,1);
%根据边权矩阵求出图的顶点数,注意此处的顶点的标号需要以自然数为序
n=max(b(1:2*m));
%整理边权矩阵,让其按照权值由小到大的次序重新排列
[B,index]=sortrows(b,3);
B=B';
%数据的初始化
t=1:n;
k=0;
T=[];
c=0;
%更新T,c,t(i)
for i=1:m
    if t(B(1,i))~=t(B(2,i))  %判断第i条边是否与树中的边形成圈
        k=k+1;
        T(1:2,k)=B(1:2,i);
        c=c+B(3,i);
        tmin=min(B(1,i),B(2,i));
        tmax=max(B(1,i),B(2,i));
        for j=1:i
            if t(j)==tmax
                t(j)=min(tmin,t(tmin));
            end
        end
    end
    if k==n-1
        break;
    end
end
%根据最小生成树的边集合构造邻接矩阵
v=zeros(n);
k=size(T,2);
for i=1:k
    v(T(2*i-1),T(2*i))=1;
    v(T(2*i),T(2*i-1))=1;
end

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有