該演算法由荷蘭的乙個牛人計算機科學家edsger wybe dijkstra在2023年發現。
這套演算法主要解決計算從乙個點到其它的點的最短距離,而不是floyd-warshall演算法的任意兩點距離。
如圖,現要計算出,從1號點到其它各點的最短距離,首先我還是轉化成矩陣
由此可見1號點到其它點的初始距離為:
0 1 12 ∞ ∞ ∞很明顯2號點是離1號點最近的點,那麼1號點到2號點的最短距離肯定就是直達了。那我就將2號點作為「換乘點」,來計算下距離:
0 1 10 4 ∞ ∞這個過程有個專業術語「鬆弛」。2號點我也已經用了,那麼4號點是離1號最近的點了,那再用它來鬆弛下:
0 1 8 4 17 19接下來,就不費話了,繼續鬆弛吧,直到所有點都用來鬆過。
這就是dijkstra演算法的思想,略屌,略屌!
現在用c來實現下:
#include int main()輸入://初始化dis,這裡存的是從1號頂點到其它頂點的初始距離
for(i = 1; i <= n; i++)
dis[i] = a[1][i];
//初始化book,標記某個點是否已經「鬆弛」過了
for(i = 1; i <= n; i++)
book[i] = 0;
book[1] = 1;//從1到1的距離是0,為確定距離
//dijkstra演算法核心**
for(i = 2; i <= n; i++)//這裡從2開始,因為1號到1號不用算了。下面也一樣
}book[u] = 1;
for(k = 1; k <= n; k++)}}
for(i = 1; i <= n; i++)
printf("%d \n", dis[i]);
return 0;
}
6 9得到結果:1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
0 1 8 4 13 17這套程式的時間複雜度為o(n2)。想想有什麼辦法還能優化它。
1407 最短距離
兩個點 a b 均在做勻速直線運動。給出 t 0時刻 a b 的座標,以及 a b 的速度,計算t 0時兩個點的距離的最小值。輸入的第一行包含乙個整數 t 1 t 200 表示一共有 t 組測試資料。對於每組測試資料,第一行包含4個整數 x a y a v ax v ay 103 x a y a v...
編輯最短距離
給定兩個字串s和t,對於t我們允許三種操作 1 在任意位置新增任意字元 2 刪除存在的任意字元 3 修改任意字元 問最少操作多少次可以把字串t變成s?例如 s abcf t dbfg 那麼我們可以 1 把d改為a 2 刪掉g 3 加入c 所以答案是3。1 把t中字元全刪了,再新增s的全部字元,操作次...
最短距離之Floyd演算法
用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離矩陣 頂點之間的最短距離矩陣 floyd演算法可以方便的求得任意兩點的最短路徑,這稱為多源最短路,演算法的核心思想是動態規劃。它將多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解。根據以往的經驗,如果要...