單源最短路徑,求解的是從該點出發的到某一點的最短距離,但是如果我們想知道到任意一點的最短距離可不可以呢?
假設d[i][j]代表的是從i到j的最短距離,如果我們能夠找到之間的關係其實就可以通過動態規劃的方法求解這個問題。
但是從i到j的選擇方式過於複雜,我們需要限制乙個點,這個點是必過還是不需要經過,這樣我們就可以只考慮兩種情況,從而進行遞推。
加乙個維度,表示是否經過點k,d[k][i][j]代表的是使用0~k個點的情況下的最短距離,我們假設從i到j的最短路徑分為,經過點k和不經過點k兩種情況來考慮,如果不經過點k,其實和經過k-1個點的最短距離一樣d[k][i][j]=d[k-1][i][j]
。如果我們需要經過點這個時候距離變成了d[k][i][j]=d[k-1][i][k]+d[k-1][k][j]
,結合起來就是:
d[k]
[i][j]
=min
(d[k-1]
[i][j]
,d[k-1]
[i][k]
+d[k-1]
[k][j]
)
我們就找到了這個遞推的關係式,但其實發現k-1可以化成乙個陣列:
int d[maxn]
[maxn]
;int v;
void
(warshall_floyd)}}
}
我們用三重迴圈求出所有點的最短路徑,所以時間複雜度是o(v^3) 迪傑斯特拉演算法(找到兩點間的最短距離)
根據該部落格的演算法進行修改 不確定是否有錯誤,如有錯誤,望指正 public int dijkstra int w,int start,int end 是否已經標號 boolean islabel new boolean w start length 所有標號的下標集合 int indexs ne...
關於已知兩點經緯度求球面最短距離的公式推導
已知兩點經緯度計算球面距離的公式,一搜一大堆,形式如下 可是至於這個公式為什麼是這樣的,今天推導了一下,詳細推導過程如下。首先畫個圖 圖1 要不然空間想象能力差的話容易犯糊塗。首先對圖1做個大致的說明,紅色的半圓表示赤道,藍色的圓弧表示本初子午線 也就是經度為0的子午線 球最上方是北極點,點a和點b...
關於已知兩點經緯度求球面最短距離的公式推導
已知兩點經緯度計算球面距離的公式,一搜一大堆,形式如下 可是至於這個公式為什麼是這樣的,今天推導了一下,詳細推導過程如下。首先畫個圖 圖1 要不然空間想象能力差的話容易犯糊塗。首先對圖1做個大致的說明,紅色的半圓表示赤道,藍色的圓弧表示本初子午線 也就是經度為0的子午線 球最上方是北極點,點a和點b...