最短路徑演算法

yinghualeihenmei發表於2024-03-20

最短路徑

我們把邊具有權重的圖稱為帶權圖,權重可以理解為兩點間的距離。一個圖中任意兩點會有多條路徑聯通,最短路徑就是這些路徑中最短的一條。

負環:環中所有邊權之重和小於0的環

Floyed演算法

演算法思想

如何讓兩個點(假設a到b)的距離變短,只能引入第三個點k,透過k進行中轉即a->k->b,當然中轉點可以是多個。

演算法分析

image

使用鄰接矩陣E儲存圖,每個格子E(i, j)表示點i到點j的最短距離,不相鄰的距離為Infinity。遍歷每一個點作為中轉點k,更新點i與點j的最短路徑。

const E: number[][] = []
for(let k=1; i<=n; i++){ // 遍歷中轉點
	// 點i到點j的最短距離更新
	for(let i=1; i<=n; i++) { 
		for(let j=1; j<=n; j++) {
			E[i][j] = Math.min(E[i][j], E[i,k]+E[k,j])
		}
	}
}

演算法總結

時間複雜度:O(n^3)
Floyed演算法適用於有負權邊的圖;但不適用於有負權環的圖。

相關文章