最短路徑弗洛伊德演算法
1. 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直接相連。
2. floyd演算法求最短路徑
Floyd演算法適用於APSP(AllPairsShortestPaths),是一種動態規劃演算法,稠密圖效果最佳,邊權可正可負。此演算法簡單有效,由於三重循環結構緊湊,對於稠密圖,效率要高於執行|V|次Dijkstra演算法。
優點:容易理解,可以算出任意兩個節點之間的最短距離,代碼編寫簡單
缺點:時間復雜度比較高,不適合計算大量數據。
時間復雜度:O(n^3);空間復雜度:O(n^2);
任意節點i到j的最短路徑兩種可能:
直接從i到j;
從i經過若干個節點k到j。
map(i,j)表示節點i到j最短路徑的距離,對於每一個節點k,檢查map(i,k)+map(k,j)小於map(i,j),如果成立,map(i,j) = map(i,k)+map(k,j);遍歷每個k,每次更新的是除第k行和第k列的數。
步驟:
第1步:初始化map矩陣。
矩陣中map[i][j]的距離為頂點i到頂點j的權值;
如果i和j不相鄰,則map[i][j]=∞。
如果i==j,則map[i][j]=0;
第2步:以頂點A(假設是第1個頂點)為中介點,若a[i][j] > a[i][1]+a[1][j],則設置a[i][j]=a[i][1]+a[1][j]。
3. 用弗洛伊德演算法求最短路徑
是地信的題吧,先給你說v1怎麼求,
先找出v1能去的最近的點,為V2,
如果S1i>S12+S2i
修改V1到Vi的距離為S12+S2i
然後去掉V2,在其餘的點中找距V1最近的,按上面的方法修改
最後得到V1與其他各點的最短距離
同樣的方法求出到其他點的最短距離
4. 求弗洛伊德演算法的詳細解釋~
floyd演算法思想:1,構建一個鄰接矩陣存儲任意兩點之間的權值如圖D0.
2、例如求v1,v4之間的最短路徑。先增加v2做中間頂點,D[1][4]=∞。if(D[1][4]>D[1][2]+D[2]4])=6+4)D[1][4]=10;這樣就可以了。
3、如不能在離得較遠的兩點(例v1,v9)直接得到上述可以滿足if的中間點,則跟據你書本的代碼可以先構建原點到中間點的最短路徑,繼而就可以求得vi,v9之間的最短路徑
5. 弗洛伊德演算法可以解決無向圖最短路徑么
可以的,弗洛伊德演算法利用動態規劃解決了無向圖中任意兩個點之間的最短路徑,時間復雜度是O(n^3),n是圖中點個數
同時可以使用狄傑斯卡拉演算法解決無向圖的最短路徑問題,他計算的是圖中指定點到其餘各點的最短路徑,時間復雜度是O(n^2)
6. 為什麼floyd演算法可以計算負權值圖的最短路徑問題
弗洛伊德演算法:Dis(i,j) =min(Dis(i,j), Dis(i,k) + Dis(k,j)).
我是這么理解的,Dis(i,k)或Dis(k,j)可以有一條邊是負的,只要兩者之和不是負的就行,因為兩個和為負就會選取到這個組合,但是路徑的結果不應該是負的。Dijkstra中S(已求出解)中的每一個點解即最短路徑是已求出的,若存在負數路徑,可能存在已求出的解不是最優解.
7. 【討論】最短路徑弗洛伊德演算法的時間復雜度
那麼你的意思是說四個循環全部都執行了的哦?否則就不是O(n4)。你看最後一個循環是需要判斷進入的,也就是說,那個循環在最內層,本身次數就少,加上排除不合法條件,很少能執行到,根據演算法思想,那麼應該忽略常數級
8. floyd演算法求最短路徑怎麼用
Dijkstra演算法
1.定義概覽
Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如數據結構,圖論,運籌學等等。注意該演算法要求圖中不存在負權邊。
問題描述:在無向圖 G=(V,E) 中,假設每條邊 E[i] 的長度為 w[i],找到由頂點 V0 到其餘各點的最短路徑。(單源最短路徑)
2.演算法描述
1)演算法思想:設G=(V,E)是一個帶權有向圖,把圖中頂點集合V分成兩組,第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將加入到集合S中,直到全部頂點都加入到S中,演算法就結束了),第二組為其餘未確定最短路徑的頂點集合(用U表示),按最短路徑長度的遞增次序依次把第二組的頂點加入S中。在加入的過程中,總保持從源點v到S中各頂點的最短路徑長度不大於從源點v到U中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點為中間頂點的當前最短路徑長度。
2)演算法步驟:
a.初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其餘頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值為∞。
b.從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。
c.以k為新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。
d.重復步驟b和c直到所有頂點都包含在S中。
9. Floyd演算法除了能求出最短距離值外,還能求出最短路徑嗎它和Dijstra演算法有什麼區別
Floyd演算法可以求出最短路徑 但要求除了距離矩陣之外 還要保存一個結果矩陣 用結果矩陣還原出最短路
Floyd演算法跟Dijstra演算法最主要的區別在於 Floyd演算法可以給出所有頂點間的最短路徑 而Dijstra只能給出從一個特定頂點到其他頂點的最短路徑 同時 Floyd演算法的復雜度為O(V^3) 而Dijstra的復雜度是 O(E+VlogV) (用斐波那契堆)
10. 弗洛伊德演算法如何去記錄最短路徑經過的每一個結點
用path數組的遞歸實現列印
例如:列印i,j之間的路徑
當path[i][j]的值為k時,分別再去列印i,k和k,j之間的路徑
如此遞歸直至兩點間直接有邊相連