Floyd演算法
A. Floyd演算法的演算法過程
1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。
2,對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。
把圖用鄰接矩陣G表示出來,如果從Vi到Vj有路可達,則G[i,j]=d,d表示該路的長度;否則G[i,j]=無窮大。定義一個矩陣D用來記錄所插入點的信息,D[i,j]表示從Vi到Vj需要經過的點,初始化D[i,j]=j。把各個頂點插入圖中,比較插點後的距離與原來的距離,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值變小,則D[i,j]=k。在G中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。
比如,要尋找從V5到V1的路徑。根據D,假如D(5,1)=3則說明從V5到V1經過V3,路徑為{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。
B. floyd演算法能不能保證有最優解
Floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。
演算法過程:
把圖用鄰接距陣G表示出來,如果從Vi到Vj有路可達,則G[i,j]=d,d表示該路的長度;否則G[i,j]=空值。
定義一個距陣D用來記錄所插入點的信息,D[i,j]表示從Vi到Vj需要經過的點,初始化D[i,j]=j。
把各個頂點插入圖中,比較插點後的距離與原來的距離,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值變小,則D[i,j]=k。
在G中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。
比如,要尋找從V5到V1的路徑。根據D,假如D(5,1)=3則說明從V5到V1經過V3,路徑為{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。
C. 比較Dijkstra演算法與Floyd演算法。
(1)Dijkstra演算法:在網路中用得多,一個一個節點添加,加一個點刷一次路由表。
Dijkstra演算法是典型的演算法。Dijkstra演算法是很有代表性的演算法。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表的方式,這里均採用永久和臨時標號的方式。注意該演算法要求圖中不存在負權邊。
(2)Floyd演算法:把所有已經連接的路徑都標出來,再通過不等式比較來更改路徑。
Floyd演算法又稱為插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的演算法。該演算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。
D. dijkstra演算法與floyd演算法有什麼區別
Dijkstra 演算法 在網路中用得多,一個一個節點添加,加一個點刷一次路由表。。
Floyd 演算法 :把所有已經連接的路徑都標出來,再通過不等式比較來更改路徑。
實現過程不太相同。。前一個是用在大網路中,對節點數目和具體連接不了解時候使用,後面是總體把握了,再對各連接具體路徑進行修正。。
E. floyd-warshall演算法的演算法概述
單獨一條邊的路徑也不一定是最佳路徑。 從任意一條單邊路徑開始。所有兩點之間的距離是邊的權的和,(如果兩點之間沒有邊相連, 則為無窮大)。 對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。 不可思議的是,只要按排適當,就能得到結果。// dist(i,j) 為從節點i到節點j的最短距離
For i←1to n do
For j←1to n do
dist(i,j) = weight(i,j)
For k←1to n do// k為「媒介節點」{一定要先枚舉媒介節點}
For i←1to n do
For j←1to n do
if(dist(i,k) + dist(k,j) < dist(i,j))then// 是否是更短的路徑?
dist(i,j) = dist(i,k) + dist(k,j)
這個演算法的效率是O(V^3)。它需要鄰接矩陣來儲存圖。
這個演算法很容易實現,只要幾行。
即使問題是求單源最短路徑,還是推薦使用這個演算法,如果時間和空間允許(只要有放的下鄰接矩陣的空間,時間上就沒問題)。
計算每一對頂點間的最短路徑(floyd演算法)
F. Floyd演算法的改進
判斷連通可以在輸入時作一下預處理
Floyd已經是DP的思想了.
可以有些小優化.但求一個圖中任意兩點的最短路徑目前只有o(n^3)的演算法
G. 關於Floyd演算法,path數組一定能保存正確的路徑嗎
你說的是浙大的mooc數據結構,我也看了,她漏了path的一步初始化,即如果存在直接邊的情況下(D[i][j]<INFINITY),是需要把path[i][j]初始化為i的。
因為如果i和j直接邊是它們的最短路徑,
if (Dist[i][k] + Dist[k][j] < Dist[i][j]) {
Dist[i][j] = Dist[i][k] + Dist[k][j];
Path[i][j] = k;
}
是不會更新path的,這樣直接邊作為最短路徑的path會為-1.
H. floyd演算法
這是由其演算法本身所決定的,其每一步求出任意一對頂點之間僅通過中間節點1,2,...,k的最短距離,當1,2,...,k擴展到所有頂點時,演算法解出任意一對頂點間的最短距離,故順序自然是:
for(k=1;k<n;++k)
//枚舉任意一對頂點
由其狀態轉移方程來看,這個演算法的順序也很清晰,應該是先計算較小的k時任意ij之間的最短距離:
dij(k) = wij 如果k=0
min(dij(k-1),dik(k-1)+dkj(k-1)) 如果k>=1
其中i,j表示點對,k表示第1,2,...,k時的最短路徑
I. Floyd演算法的優缺點分析
Floyd演算法適用於APSP(All Pairs Shortest Paths,多源最短路徑),是一種動態規劃演算法,稠密圖效果最佳,邊權可正可負。此演算法簡單有效,由於三重循環結構緊湊,對於稠密圖,效率要高於執行|V|次Dijkstra演算法,也要高於執行V次SPFA演算法。
優點:容易理解,可以算出任意兩個節點之間的最短距離,代碼編寫簡單。
缺點:時間復雜度比較高,不適合計算大量數據。
J. Floyd演算法 c++ 牛人幫忙啊~!~!
我注冊不了id。什麼網站還不能注冊。你看是不是輸出有問題。你的輸出是輸入全部的詢問再輸出。我看題目的意思好像是輸入一次再輸出一次。你試一試。