matlab如何画出最小生成树
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab如何画出最小生成树相关的知识,希望对你有一定的参考价值。
画最小生成树的两种方法:一种是避圈法
function A = fun(W) [m, n] = size(W); e = 0;for i = 1 : n for j = i : n if W(i, j) ~= 0 e = e + 1; E(e, :) = [i, j, W(i, j)]; end endend % sort W's edge by weightfor i = 1 : e - 1 for j = i + 1 : e if E(i, 3) > E(j, 3) temp = E(j, :); E(j, :) = E(i, :); E(i, :) = temp; end endend A = zeros(1, 3);S = 1 : n; for i = 1 : e % if find-set(u) ~= find-set(v) if S(E(i, 1)) ~= S(E(i, 2)) % A = A + (u, v) A = cat(1, A, E(i,:)); %union(u, v) indicator = S(E(i, 1)); for j = 1 : n if S(j) == indicator S(j) = S(E(i, 2)); end end endend A(1, :) = [];
例子:W=xlsread('C:\Users\paul\Desktop\**.xls');fun(W)
破圈法
function T=tree()
A=[inf 50 14 40 13;50 inf 15 20 inf;14 15 inf 10 20;40 20 10 inf 10;13 inf 20 10 inf];n=5;k=1;for(i=1:n-1) for(j=i+1:n) if(A(i,j)>0) x(k)=A(i,j); kk=1; for(s=1:k-1) if(x(k)==x(s)) kk=0; break; end end k=k+kk; end endendk=k-1;for(i=1:k-1) for(j=i+1:k) if(x(j) xx=x(j); x(j)=x(i); x(i)=xx; end endendT(n,n)=0;q=0;for(s=1:k) if(q==n)break; endfor(i=1:n-1) for(j=i+1:n) if (A(i,j)==x(s)) T(i,j)=x(s); T(j,i)=x(s);TT=T;while(1)pd=1;for(y=1:n)kk=0;for(z=1:n) if(TT(y,z)>0) kk=kk+1; zz=z; end;endif(kk==1) TT(y,zz)=0; TT(zz,y)=0; pd=0;endendif(pd)break;endendpd=0;for(y=1:n-1) for(z=y+1:n) if(TT(y,z)>0)pd=1; break; end endendif(pd) T(i,j)=0; T(j,i)=0;else q=q+1;end end endendend 参考技术A 你可以根据邻接矩阵画出一颗树,根据权值将其从小到大进行排列,画最小生成树时就根据从小到大画出,但若遇到将其权值画上去后会弄成一个圈后,则这个权值就不画上去了,这时,就画下一个权值了,依此类推,就可以画出最小生成树
以上是关于matlab如何画出最小生成树的主要内容,如果未能解决你的问题,请参考以下文章
使用克鲁斯卡尔算法为以下无向图构造出一棵最小生成树,请画出构造的每一步骤
最小生成树matlab代码Kruskal算法,用于二维网络生成