弗洛伊德演算法:求任意一點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 演算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個演算法通過考慮最佳子路徑來...