最短路 Floyd演算法和Dijkstra演算法

2022-05-10 14:15:26 字數 1489 閱讀 2959

兩者在負權問題上不是很好,最好只處理正值,dijkstra演算法對負權毫無辦法,但是floyd演算法不能處理出現負環的東西。。。

dijkstra演算法的話,為了方便,我認為從i到i點不可達;百部百科解釋挺好,那個堆優化挺好的

floyd演算法百部百科也不錯,都是老演算法了,哪都有資料

這位筒子的寫得很好

mathematica下的**【我也覺得mathematica寫很詭異。。。】

(*dijkstra演算法,其思想和prim有點像,輸出的是每個點的前向節點*)

dijkstra[tu_, dian_, point_] :=module[

], diannum = dian, visin = table[false, ], k, lval,

mindis, flag =true},

visin[[point]] =true;

k =point;

while[diannum != 0

, mindis =infinity;

do[if[visin[[i]] == false && dis[[i]] < mindis, mindis =dis[[i]];

k =i]

, ];

if[mindis == infinity, flag =true; break];

diannum--;

visin[[k]] =true;

do[if[visin[[j]], continue];

lval = tu[[k]][[j]] +dis[[k]];

if[lval

< dis[[j]], dis[[j]] = lval; pre[[j]] =k]

, ]];

pre]

dijkstra

input:

tuer = , , , , , , }

dijkstra[tuer,

7, 1

]out:

示例

(*floyd演算法,列印輸出了長度,函式輸出前節點*)

floyd[tu_, dian_] :=module[

, ], dis =tu, lenn},

do[do[

do[lenn = dis[[i, k]] +dis[[k, j]];

if[dis[[i, j]] > lenn, path[[i, j]] = k; dis[[i, j]] =lenn]

, ], ]

, ];

print[dis];

path

]

floyd

input:

tuer = , , , , , , }

floyd[tuer, 7]

during evaluation of input:

,,,,,,}

out:

, , , , , , }

示例

floyd 最短路演算法

floyd最短路徑演算法 在圖論中經常會遇到這樣的問題,在乙個有向圖裡,求出任意兩個節點之間的最短距離。我們在離散數學 資料結構課上都遇到過這個問題,在計算機網路裡介紹網路層的時候好像也遇到過這個問題,記不請了.但是書本上一律採取的是dijkstra演算法,通過dijkstra演算法可以求出單源最短...

最短路 Floyd演算法

1.定義概覽 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n3 空間複雜度為o n2 2.演...

最短路 Floyd演算法

floyd演算法思想 1.初始化矩陣 i,j連線則矩陣的值為邊的代價,否則為max 2.計算 i 經過 k 到 j 的最短路徑map i,j min並儲存路徑 時間複雜度 o n 3 空間複雜度 t n 2 void floyd int n n為節點數,節點從1開始 例題 include inclu...