1. 程式人生 > >數學建模(14)——MATLAB實現最小生成樹(Prim與Kruskal演算法)

數學建模(14)——MATLAB實現最小生成樹(Prim與Kruskal演算法)

Prim演算法

1
連通賦權圖如上
鄰接矩陣如下
0 50 60 0 0 0 0
0 0 0 65 40 0 0
0 0 0 52 0 0 45
0 0 0 0 50 30 42
0 0 0 0 0 70 0

function [result]=prim(a);
% 輸入:a—鄰接矩陣,a(i,j)是指i到j之間的權值
% 輸出:result—第一、二、三行分別代表最小生成樹邊的起點、終點、權集合
a(a==0)=inf; result=[];p=1;tb=2:length(a); while size(result,2)~=length(a)-1 temp=a(p,tb);temp=temp(:); d=min(temp); [jb,kb]=find(a(p,tb)==d); j=p(jb(1));k=tb(kb(1)); result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[]; end end

Kruskal演算法

function [result]=kruskal(a)
% 輸入:a—鄰接矩陣,a(i,j)是指i到j之間的權值
% 輸出:result—第一、二、三行分別代表最小生成樹邊的起點、終點、權集合
[i,j,b]=find(a);
data
=[i';j';b'];index=data(1:2,:);
loop=length(a)-1; result=[]; while length(result)<loop temp=min(data(3,:)); flag=find(data(3,:)==temp); flag=flag(1); v1=index(1,flag);v2=index(2,flag); if v1~=v2 result=[result,data(:,flag)]; end index(find(index==v2))=v1; data(:,flag)
=[];
index(:,flag)=[]; end end