Floyed算法

Floyed算法

Floyd-Warshall 算法用來找出每對點之間的最短距離,它需要用鄰接矩陣來儲存邊,這個算法通過考慮最佳子路徑來得到最佳路徑。

定義

Floyd-Warshall 算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個算法通過考慮最佳子路徑來得到最佳路徑。 注意單獨一條邊的路徑也不一定是最佳路徑。

思想

從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,或者無窮大,如果兩點之間沒有邊相連。
對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。

實現

Pascal程式:
for i:= 1 to n do
for j:= 1 to n do
read(f[i,j]);
for k:= 1 to n do
for i:= 1 to n do
for j:= 1 to n do
if (i<>j)and(i<>k)and(j<>k)and(f&#91;i,k&#93;+f&#91;k,j&#93;<f&#91;i,j&#93;) then
f&#91;i,j&#93;:=f&#91;i,k&#93;+f&#91;k,j&#93;;

總評

時間複雜度O(n^3),只要有存下鄰接矩陣的空間,時間一般沒問題,並且不必擔心負權邊的問題。

圖文

弗洛耶德算法(Floyed算法):
基本思想:求解所有點間的路徑需要進行n次試探。對於頂點i到頂點j的路徑長度,首先考慮讓路徑經過頂點1,比較路徑(i,j)和(i,1,j)的長度取其短者為當前求得的最短路徑長度。對每一對頂點的路徑都做這樣的試探,則可求得一個矩陣設為A(1),求n次即得每對頂點間的最短路徑A(n)。A(0)=A:鄰接矩陣。如下圖:


程式如下:
program floyed;
const n=4;
var
cost,a:array&#91;1..n,1..n&#93;of integer;
p:array&#91;1..n,1..n&#93; of 0..n;
i,j,k:integer;
procedure init;
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
read(cost&#91;i,j&#93;);
a&#91;i,j&#93;:=cost&#91;i,j&#93;;
p&#91;i,j&#93;:=0;
end;
end;
procedure path(i,j:integer);
var k:integer;
begin
k:=p&#91;i,j&#93;;
if k<>0 then begin path(i,k);write('->',k);path(k,j);end
end;
begin
init;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if a&#91;i,k&#93;+a&#91;k,j&#93;<a&#91;i,j&#93; then
begin
a&#91;i,j&#93;:=a&#91;i,k&#93;+a&#91;k,j&#93;;
p&#91;i,j&#93;:=k;
end;
for i:=1 to n do
for j:=1 to n do
if i<>j then
begin
writeln('a&#91;',i,',',j,'&#93;=",a&#91;i,j&#93;);
write(i);
path(i,j);
writeln("->',j)
end;
end.
注意:弗洛耶德算法(Floyed算法)思想可用與判斷有向圖中任意兩點是否連通?算法如下:
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (a&#91;i,k&#93;=1)and (a&#91;k,j&#93;=1) then a&#91;i,j&#93;=1 (a&#91;i,j&#93;=1表示i可達j,a&#91;i,j&#93;=0表示i不可達j)。

相關詞條

相關搜尋

熱門詞條

聯絡我們