1.Floyed演算法
1.1適用範圍
∙ \bullet∙ 求每隊頂點的最短路徑
∙ \bullet∙ 有向圖、無向圖和混合圖
1.2演算法思想
直接在圖的帶權鄰接矩陣中用插入頂點的方法依次遞推地構造出n個矩陣D(1),D(2)…D(n)(每次加入一個點然後更新最短路徑矩陣D),D(n)是圖的最短距離矩陣,同時引入一個後繼點矩陣path記錄兩點間的最短路徑。
1.3例項
對於如下無向圖:
我們可以得如下帶權鄰接矩陣:
2.程式碼
2.1floyd函式
function [D,path,min1,path1]=floyd(a,start,terminal)
%D(i,j)表示i到j的最短路徑,path(i,j)表示i到j之間的最短路徑上頂點i的後繼點。
%min1返回start和terminal之間的最短距離,path1返回start和terminal之間的最短路徑
%a為帶權鄰接矩陣,start、terminal分別是起始點和終止點
D=a;n=size(D,1);path=zeros(n,n);
%n為頂點個數,生成D、path矩陣
%遍歷一遍矩陣,初始化path矩陣,先將可以直接相連的點的path進行補充
for i=1:n
for j=1:n
if D(i,j)~=inf
path(i,j)=j;
end
end
end
%三重遍歷,查詢是否有中繼點可以使得路徑縮短,若有則更新D、path矩陣
for k=1:n
for i=1:n
for j=1:n
if D(i,k)+D(k,j)<D(i,j)
D(i,j)=D(i,k)+D(k,j);
path(i,j)=path(i,k);
end
end
end
%這裡演示了每一步的調整過程
k,D,path
end
%判斷輸出引數是否為三個
if nargin==3
min1=D(start,terminal);
m(1)=start;
i=1;
path1=[ ];
%根據path路徑一步一步跳轉找到具體路徑,返回path1
while path(m(i),terminal)~=terminal
k=i+1;
m(k)=path(m(i),terminal);
i=i+1;
end
m(i+1)=terminal;
path1=m;
end
————————————————
原文連結:www.9he.com
本作品採用《CC 協議》,轉載必須註明作者和本文連結