弗洛伊德演算法

2021-07-04 06:15:55 字數 1995 閱讀 8244

弗洛伊德演算法:求任意一點i到任意一點j的最短路。

分析:求i到j的最短路,大可以使用群舉法,因為點都是離散的,i到j的路徑是有限的,所以一定可以通過群舉法得到最短路,但群舉法卻沒太大意義,他的意義在於:把群舉法(通過修改)進行分類,得到好的演算法。

flod演算法的分類標準是:通過i到j過點的情況進行分類。

先分成兩類(可以說是貪婪演算法的核心思想)

i......1......j(過1號點)《1》

i.................j(不過1號點)《2》

《1》中i---1--j的路徑 = i----1+1----j;而i----1一定不過1點可以用《2》得到

結論:i到j的最短路只要比較《1》和《2》即可,並且《1》可由《2》得到,所以只要得到《2》即可,因此這個方法的意義在於:減小了點的個數,達到簡化的目的。

然後依次往下遞推

i到j 不過2,3,4,5直到i到j不過任何點,即直達。

現在逆推上去:

1從i到j,先選乙個中間節點試試,比如1號節點。

2比較i-j(直達)和i-1-j的大小,選擇小的就可確定在3個點的情況下i到j的最短路。(i,j,1);

3然後增加乙個節點,(2號節點),比較i----j(不過2號節點)和i---2和2--j(過2號節點)的大小即可,此時的節點空姐為(i,j,1,2)四個點。

依次類推就可得到flod演算法;

演算法描述:floyd演算法是乙個動態規劃演算法,最初矩陣a0是圖的鄰接矩陣,ak矩陣表示從i到j的最短路徑,這些路徑不能能通過大於k的節點,最終的矩陣an就是想要得到的矩陣了。那麼ak矩陣與a(k+1)矩陣有什麼關係呢?關係就是a(k+1)[i,j]=min(a(k)[i,j],a(k)[i,k]+a(k)[k,j]),也就是看加上k點後,是不是能找到更短的距離。

舉例說明

%floyd演算法通用程式,輸入a為賦權鄰接矩陣

%輸出為距離矩陣d,和最短路徑矩陣path

function [d,path]=floyd(a)

n=size(a,1);

d=a;

path=zeros(n,n);

for i=1:n

for j=1:n

if d(i,j)~=inf

path(i,j)=j;

endend

endfor k=1:n

for i=1:n

for j=1:n

if d(i,k)+d(k,j)

%配合floyd演算法的後續程式,s為源點,t為宿點

%l為長度,r為路由

function [l,r]=router(d,path,s,t)

l=zeros(0,0);

r=s;

while 1

if s==t

l=fliplr(l);

l=[0,l];

return

endl=[l,d(s,t)];

r=[r,path(s,t)];

s=path(s,t);

end//如何用:

首先對path的說明:這裡的d是用floyd算出的距離矩陣,path是最短路徑矩陣。

path是這樣的,他的結果是任意兩點最短距離所經過的最後乙個中間節點。比如

說是path[2,10]=7;這就說明2號節點到10號節點距離時,當新增7號節點能夠縮

短他們之間的距離,當然7號節點是最後乙個能縮短他們之間距離的中間節點。

//router何時用:比如說對於災難巡視模型,乙個人走完所有村莊,經過的路程最短,(類似tsp問題)

這個問題你可以用hamilton圈解決,先把一般圖轉化為完全圖,因為完全圖一定可以找到hamiltom圈,找到之後形成一條迴路,比如

1-2-3-4-5-6;但在原圖(一般圖)中2-3沒有邊相連,這時你需要,找出2-3最短路程的的路徑,這時可以用呼叫[l,r]=router(d,path,2,3),

r就是路徑(走法)

弗洛伊德演算法

弗洛伊德演算法 floyd 又稱為是插點法。目的是求加權圖中頂點中最短路徑的方法。本文通過舉例子的方法想你具體解釋何為弗洛伊德演算法。有乙個送禮物的問題,是csdn上的乙個題目,題目的詳情是這樣的。hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外...

弗洛伊德演算法

floyd演算法詳解 求解任意兩點間的最短距離 floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 我們平時所見的floyd演算法的一般形式如下 1void floyd 注意下第6行這個地方,如果dist i k 或者dist k j 不存...

弗洛伊德演算法

floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 使用條件 範圍 通常可以在任何圖中使用,包括有向圖 帶負權邊的圖。floyd warshall 演算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個演算法通過考慮最佳子路徑來...