首先要考慮動態規劃是的狀態空間是乙個點集和起始點與終點.假設d
ijk 代表從i到j只用0到k個節點作為中間節點,d[i][j]代表i到j的最短路徑.那麼di
jk= min,也就是是最小的路徑總是在新加入的點或者以前的點集中產生.d[i][j] = di
jv,(v代表全部節點).很顯然這需要三重迴圈來計算所有點之間的最短路徑.
[3]現在要考慮如何來構建迴圈,實際上,我們計算 di
jk之前必須知道di
j(k−
1),所以k應該放在所有迴圈的最外面.然後裡面兩重迴圈是i,j。
[4]那麼 di
j(k−
1)是如何被計算的呢?,這是迴圈裡面的核心內容,首先我們需要乙個鄰接矩陣用來儲存相鄰節點之間的距離.在乙個雙重內迴圈裡面,考慮一開始的值k=0,我們只用節點0作為中間節點,對於所有的d[i][j],d[i][j] = min(c[i][j],d[i][k]+d[k][j]),假如存在這樣只含有節點0的中間節點的最短通路就被計算出來了.接著,當k=1的時候,我們計算d[i][j] = min(d[i][j],d[i][k]+[k][j])。如果對於某一對(i,j),存在只包含了中間節點0,1的最短路徑,那麼d[i][j]代表的是只通過節點0的路徑或者是沒有通過節點的路徑,而d[i][k] + d[k][j]則體現了通過了節點1的路徑.
這裡有乙個問題,那就是d[i][k]與d[k][j]是否已經代表i到k的最短路徑?即是否已經被及時更新了呢?其實可以這樣理解,在第一次k=0,的迴圈中,d[i][1]與d[1][i]也是作為最短路徑被計算過的,如果它們之間能夠通過0或者直接相鄰,那麼它們也將被計算出來(而不是infinity).綜上分析,在第k次迴圈中,前k-1個中間節點必然被計算出來,而且起始點i到新的中間點k的路徑d[i][k]如果只通過(節點0…..k-1)和相對應的d[k][j]都將被計算出來.
#include "stdafx.h"
#define n 5
#define notvertex -1
#define infinity 100000
void allpairs(int a[n],int d[n],int path[n])
for(k = 0;k<=i-1;k++)
else
if (k!=notvertex)//不相鄰但可達
}void print(int a[n],int path[n],int start, int end )
printf(" %d ",start);
printpath(a,path,start,k);
printpath(a,path,k,end);
}int _tmain(int argc, _tchar* argv)
,d[n][n],path[n][n];
for( i = 0;i<=n-1;i++)
for(j = 0;j<=n-1;j++)
a[0][2] = 100;
a[0][1] = 2;
a[1][3] = 3;
a[3][4] = 2;
a[4][2] = 2;
allpairs(a,d,path);
print(a,path,0,2);
return
0;}
遍歷所有點的最短路徑python 所有節點最短路徑
如果您嘗試在所有節點上迴圈,可以對初始值current執行迴圈。這將需要對 進行最少的修改 nodes a b c d e f g distances a d g c e f for start in nodes current start currentdistance 0 unvisited v...
Floyd演算法(求所有節點對的最短路徑)
floyd演算法 求所有節點對的最短路徑 首先考慮使用單源最短路徑演算法重複 v 次,這樣的複雜度會達到 v 4,因為其中有很多重複的運算。floyd演算法複雜度為 v 3。其維護乙個二維陣列q,q i j 表示i到j的最短路徑長度,如果不存在則為無窮大,若i j則為0。然後分別利用節點0 1 2 ...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...