Matlab生成Kruskal最小生成樹
%程式設計工具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
相關文章
- Kruskal 最小生成樹演算法演算法
- 北極通訊網路——最小生成樹kruskal
- 最小生成樹(MinSpanTree)的Kruskal演算法演算法
- 最小生成樹:Kruskal演算法和Prim演算法演算法
- 最小生成樹-Prim演算法和Kruskal演算法演算法
- 最小生成樹之Prim演算法和Kruskal演算法演算法
- 最小生成樹
- 最小度限制生成樹
- 【模板】最小生成樹
- 【圖論】最小生成樹圖論
- 最小生成樹專項
- 圖論 最小生成樹圖論
- Prim 最小生成樹 圖解圖解
- 東哥帶你刷圖論第五期:Kruskal 最小生成樹演算法圖論演算法
- 最小生成樹學習筆記筆記
- 最小生成樹__Kurskal演算法演算法
- 最小生成樹__Prim演算法演算法
- 最小生成樹的演算法演算法
- 使用canvas尋路最小生成樹Canvas
- 最小生成樹,Prim演算法與Kruskal演算法,408方向,思路與實現分析演算法
- 最小生成樹之 Prim 演算法演算法
- 【演算法學習】最小生成樹演算法
- NOIP 複習題之最小生成樹
- 演算法-圖論-最小生成樹演算法圖論
- 一些“最小生成樹”板題
- BZOJ 1626 [Usaco2007 Dec]Building Roads 修建道路:kruskal(最小生成樹)UI
- 最小樹形圖(有向圖的最小生成樹)朱劉演算法演算法
- 淺談三種求最小生成樹的方法
- 最小生成樹prim普里姆演算法演算法
- 最小生成樹之普里姆演算法演算法
- 圖論中的最小生成樹演算法圖論演算法
- Boruvka求最小生成樹(菠蘿演算法)演算法
- 關於圖的最小生成路徑——Kruskal演算法和Prime演算法演算法
- 最小生成樹---普里姆演算法(Prim演算法)和克魯斯卡爾演算法(Kruskal演算法)演算法
- 前端必會演算法 - 最小生成樹問題前端演算法
- 圖論之帶權圖「最小生成樹之Prim」圖論
- matlab如何生成exeMatlab
- 生成樹協議與多生成樹協議協議