Matlab生成Kruskal最小生成树
2013-02-02 12:18
204 查看
%编程工具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
%这是一个通过避圈法求解连通带权图的最小生成树的程序.
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
相关文章推荐
- Matlab实现Kruskal最小生成树算法
- matlab练习程序(Kruskal最小生成树)
- 手写matlab的Kruskal最小生成树(注释很详细)
- 最小生成树—Kruskal模板
- HDOJ 1863 畅通工程(Kruskal最小生成树)
- 最小生成树 Prim(普里姆)算法和Kruskal(克鲁斯特尔)算法
- 关于最小生成树中的 Kruskal(克鲁斯卡尔)算法
- poj 2421 Constructing Roads kruskal克鲁斯卡尔最小生成树
- Kruskal最小生成树--快排--并查集
- HDU1875畅通工程之最小生成树——kruskal
- NYOJ 38 布线问题(最小生成树--kruskal)
- 最小生成树-kruskal 模板
- hdu 1233 还是畅通project(kruskal求最小生成树)
- 杭电1102Constructing Roads(kruskal)(最小生成树)
- BZOJ.2177.曼哈顿最小生成树(Kruskal)
- 【算法复习】图的最小生成树(Prim&Kruskal)
- uva-1151-Buy or Build-二进制枚举子集,并查集,最小生成树,kruskal
- C语言实现图的Kruskal最小生成树算法
- 最小生成树(kruskal&prim)畅通工程
- C++代码,数据结构-最小生成树的两个算法,Prime&Kruskal