Dijkstra演算法 最短距離

2021-09-02 16:10:07 字數 1299 閱讀 8144

該演算法由荷蘭的乙個牛人計算機科學家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演算法可以方便的求得任意兩點的最短路徑,這稱為多源最短路,演算法的核心思想是動態規劃。它將多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解。根據以往的經驗,如果要...