JavaScript與Floyd最短路演算法

2021-08-19 04:46:47 字數 2285 閱讀 8585

nba超級後場組合燈泡組合(harden和cp3)休賽期來到中國玩耍,他們兩人打算在四個城市進行玩耍,最後他們選擇了北京、上海、西安和長沙。假設這四個城市之間有些城市之前有航線,而有些城市之間沒有航線。為了方便行程,出發前,他們想要知道任意兩個城市之間的最短路程。如果下圖就是航線圖:

我們使用乙個二維陣列path來儲存上述圖的資訊。比如說0號城市到1號城市之間的距離可以儲存為path[0][1] = 2,而1號城市無法直接到達0號城市我們記path[1][0] = infinity。另外我們約定乙個城市到達本身的距離為0,即path[0][0] = 0

想要使兩個城市(xy)之間的距離變短,此時我們可以引入第三個城市作為中轉點(z),本來是x->y,現在變成x->z->y,只有這樣才有可能縮短xy之間的距離,那麼這個中轉點z到底是哪個城市,或者可以說這個z代表的是多個中轉點,因為有時候經過多個中轉點,x*y之間的距離會更短。下面我們通過一步步的新增中轉點,來更新兩點之間的最短距離。

我們依照最上面的航線圖,解釋如何得到最短路徑。

當任意兩個城市之間不允許經過第三個城市的時候,得到的矩陣如下:

第一步:

現在我們只允許經過0號城市這個中轉點,這個時候如何求解任意兩點之間的最短距離。我們只需進行如下比較:

path[i][0] + path[0][j] < path[i][j]

其中path[i][j]表示的是城市ij之間的距離。而path[i][0] + path[0][j]表示的是先從i0號城市,再從0j的距離之和。

這個時候把i0~n-1迴圈,把j0~n-1迴圈,既可以得到當經過中轉點0號城市的時候,任意兩點之間的最短距離。

**實現:

for(var i = 0; i < n; i++ )}}

這個時候我們可以把最短距離矩陣更新為:

從上圖可以看出,在經過中轉點:0號城市的時候,有幾個城市之間的最短距離減少了。

接下來,我們要做的就是增加中轉點:1號城市。要執行的**如下:

for(var i = 0; i < n; i++ )

}}for(var i = 0; i < n; i++ )}}

我們可以繼續更新距離矩陣為:

從上圖可以看出,增加中轉點後,有些城市之間的最短距離進一步減小。

同理,我們進一步增加中轉點城市2和城市3,就可以得到最終的距離矩陣為:

下面給出乙個完整函式:

//接收乙個引數,引數即用二維陣列儲存的距離矩陣

function

floyd

(path)}}}}}

注意:floyd演算法不能解決帶有「負權迴路」(或者叫「負權環」)的圖。因為帶有「負權迴路」的圖沒有最短路。

JavaScript與ActiveX之間傳遞資料

本文研究如何在js等指令碼語言與activex控制項之間通訊,如何傳遞各種型別的引數,以及com的idispatch介面。使用類似的方法,可以推廣到其他所有指令碼型語言,如lua,autocad等。本文將研究以下幾個方面 整型陣列傳參 字串引數,字串返回值 修改傳入字串內容 陣列引數 idispat...

JavaScript 錯誤與除錯

首先先說錯誤的概念預處理 電腦程式的錯誤分為兩種 語法錯誤和邏輯錯誤。比如alert拼寫錯誤,寫成了alter vara 3 4 alert a alter 7 a alert a 執行結果只顯示了7 後面的結果沒有顯示,說明後面的 沒有執行。因為輸出7後遇到了語法錯誤,程式終止執行。上例也進一步說...

JavaScript中 與 區別

用於一般比較,不區分資料型別,只區分值是否相等 如果兩個資料的資料型別不同,則在比較前會先將資料型別進行轉換 var state 1 1 true var state 1 1 true,會先將 1 轉為數字1 var state 1 true true,會先將true轉為數字1 關係運算子中如果數值...