您的位置:首页 > 编程语言 > MATLAB

Matlab生成Kruskal最小生成树

2013-02-02 12:18 169 查看
%编程工具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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: